G. Ва-банк
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Густав — старший менеджер большого банка. У него есть неограниченный доступ в базу данных банка, и в несколько кликов он может переместить любую сумму со счета банковского резерва на свой личный счет. Однако банк недавно внедрил популярную систему, использующую искусственный интеллект, для отслеживания мошеннических операций, что затрудняет кражу.

Густав знает, что данная система просто отслеживает все операции, превышающие сумму в $$$M$$$ евро, и такие операции проверяются вручную некоторым количеством банковских работников. Поэтому любая мошенническая операция, превышающая данный лимит, будет обнаружена, а любая меньшая операция останется незамеченной.

Густав не знает значение лимита $$$M$$$ и хочет его найти. За одну операцию он может выбрать некоторое целое число $$$X$$$ и попробовать переместить $$$X$$$ евро из банковского резерва на личный счет. Затем случается следующее.

  • Если $$$X \le M$$$, то операция остается незамеченной и баланс на счете Густава увеличивается на $$$X$$$ евро.
  • В противном случае, если $$$X > M$$$, операцию обнаруживают и отменяют. Более того, в таком случае Густаву нужно оплатить штраф в $$$X$$$ евро со своего счета. Если у него на счете меньше, чем $$$X$$$ евро, то его увольняют и передают полиции.

Изначально на счету Густава $$$1$$$ евро. Помогите ему найти точное значение $$$M$$$ за не более чем $$$105$$$ операций, не допуская увольнения.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число $$$t$$$ ($$$1 \le t \le 1000$$$) — количество наборов входных данных.

В каждом наборе входных данных нет никаких входных данных до вашего первого запроса. Гарантируется, что $$$M$$$ — целое число, и $$$0 \le M \le 10^{14}$$$.

Выходные данные

В каждом наборе входных данных, когда вы знаете значение $$$M$$$, выведите одну строку формата «! $$$M$$$». После этого ваша программа должна перейти к следующему набору входных данных или завершиться, если это был последний набор.

Протокол взаимодействия

Когда вы хотите сделать операцию, выведите строку формата «? $$$X$$$», означающую, что вы пробуете переместить $$$X$$$ евро ($$$1 \le X \le 10^{14}$$$). К качестве ответа считайте одну строку, которая может принимать следующие значения:

  • «Lucky!», если $$$X \le M$$$. Баланс вашего счета увеличивается на $$$X$$$.
  • «Fraudster!», если $$$X > M$$$. Баланс вашего счета уменьшается на $$$X$$$.
  • «Fired!», если $$$X > M$$$, но вы не можете выплатить $$$X$$$ евро штрафа. В таком случае ваша программа должна немедленно завершиться. Вы также получите такой ответ, если превысили максимальное число запросов.

Вы можете сделать не более чем $$$105$$$ запросов такого типа в каждом наборе входных данных.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Чтобы сделать взлом, подготовьте входные данные в следующем формате.

Первая строка содержит одно целое число $$$t$$$ ($$$1 \le t \le 1000$$$) — количество наборов входных данных.

Каждый набор входных данных описывается строкой, содержащей одно целое число $$$M$$$ ($$$0 \le M \le 10^{14}$$$).

Пример
Входные данные
1

Lucky!

Lucky!

Lucky!

Lucky!

Lucky!

Fraudster!
Выходные данные
? 1

? 2

? 3

? 4

? 5

? 6

! 5
Примечание

В примере $$$M = 5$$$, поэтому операция $$$X = 6$$$ будет обнаружена. В этот момент баланс счета Густава составляет $$$16$$$ евро, поэтому он просто платит штраф.