Это интерактивная задача.
Студент Иван обожает игры, в которых нужно отгадывать числа.
В данный момент он играет на компьютере в игру, в которой нужно отгадать два загаданных числа $$$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») сразу после вывода нужно сделать:
Другие варианты: cout.flush(), cout << flush.
Если вы используете не System.out, то используйте команду flush вашего потока вывода.
Напрямую можно сделать «flush» с помощью sys.stdout.flush() (требует import sys).
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$$$ и является единственным возможным.
| Name |
|---|


