I. Отгадай два числа
ограничение по времени на тест
0.5 секунд
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Это интерактивная задача.

Студент Иван обожает игры, в которых нужно отгадывать числа.

В данный момент он играет на компьютере в игру, в которой нужно отгадать два загаданных числа $$$A$$$ и $$$B$$$, $$$(0 \le A, \ B \le 10^{9})$$$. В этой игре можно сделать запрос, который заключается в том, чтобы дать компьютеру число $$$X$$$, а в ответ получить значение выражения $$$(A \oplus X) + B$$$. Разрешается сделать не более пяти таких запросов, после чего игрок должен отгадать оба числа.

Здесь $$$\oplus$$$ обозначает операцию побитового исключающего ИЛИ — бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. Другими словами, если оба соответствующих бита операндов равны между собой, двоичный разряд результата равен $$$0$$$, в противном случае, двоичный разряд результата равен $$$1$$$.

Операция $$$\oplus$$$ существует во всех современных языках программирования, например, в языках Python, C++ и Java она обозначена как «$$$^\land$$$», а в Pascal — как «$$$\text{xor}$$$».

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

Для чтения ответов на запросы вида «$$$? \ X$$$» программа должна использовать стандартный ввод.

Входные данные будут содержать ответы на запросы, то есть значения выражений $$$(A \oplus X) + B$$$.

Тестирующая система даст вашей программе прочитать ответ на запрос из входных данных только после того, как ваша программа вывела соответствующий запрос системе и выполнила операцию flush.

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

Для осуществления запросов программа должна использовать стандартный вывод.

Ваша программа должна выводить запросы по одному в строке в виде «$$$? \ X$$$» (без кавычек), где $$$X$$$ $$$(0 \le X \le 10^{10})$$$ — число, которое мы даем компьютеру в момент запроса. После вывода каждой строки программа должна выполнить операцию flush.

Обратите внимание, что вы можете сделать не более $$$5$$$ запросов типа «$$$? \ X$$$».

Каждое из значений $$$X$$$ обозначает очередной запрос к системе. Ответ на запрос программа сможет прочесть из стандартного ввода.

В случае, если ваша программа отгадала два числа, выведите строку вида «$$$! \ A \ B$$$» (без кавычек), где $$$A$$$ и $$$B$$$ — это два загаданных числа, и завершите работу своей программы.

Запрос на вывод ответа не входит в ограничение на $$$5$$$ запросов.

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

Для сброса буфера вывода (то есть для операции «flush») сразу после вывода нужно сделать:

  • C++: endl одновременно и делает перевод строки, и «flush»;

    Другие варианты: cout.flush(), cout << flush.

  • Java: System.out.println() одновременно и делает перевод строки, и «flush».

    Если вы используете не System.out, то используйте команду flush вашего потока вывода.

  • Python: print одновременно и делает перевод строки, и «flush»;

    Напрямую можно сделать «flush» с помощью sys.stdout.flush() (требует import sys).

  • Pascal: Выполните flush(output) после вывода через writeln.
Пример
Входные данные

1

2

3

4

5
Выходные данные
? 1

? 2

? 3

? 4

? 5

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

В тестовом примере показано, как программа взаимодействует с проверяющей системой.

Сначала программа задает запрос первого типа $$$? \ 1$$$ (дает компьютеру число $$$X = 1$$$), а затем считывает число $$$1$$$ — ответ на этот запрос.

Далее программа задает запрос первого типа $$$? \ 2$$$ (дает компьютеру число $$$X = 2$$$), а затем считывает число $$$2$$$ — ответ на этот запрос.

Далее программа задает запрос первого типа $$$? \ 3$$$ (дает компьютеру число $$$X = 3$$$), а затем считывает число $$$3$$$ — ответ на этот запрос.

Далее программа задает запрос первого типа $$$? \ 4$$$ (дает компьютеру число $$$X = 4$$$), а затем считывает число $$$4$$$ — ответ на этот запрос.

Далее программа задает запрос первого типа $$$? \ 5$$$ (дает компьютеру число $$$X = 5$$$), а затем считывает число $$$5$$$ — ответ на этот запрос.

И в конце программа выводит ответ на задачу в виде $$$! \ 0 \ 0$$$ и завершает свою работу.

Почему ответ в данном случае равен $$$0 \ 0$$$?

Можно проверить, что такой ответ, действительно, подходит, так как $$$(0 \oplus 1) + 0 = 1$$$, $$$(0 \oplus 2) + 0 = 2$$$, $$$(0 \oplus 3) + 0 = 3$$$, $$$(0 \oplus 4) + 0 = 4$$$, $$$(0 \oplus 5) + 0 = 5$$$. Также можно доказать, что конкретно для такого набора полученных ответов на запросы ответ равен $$$0 \ 0$$$ и является единственным возможным.