Statement is not available in English language
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$$$ и является единственным возможным.