G. Запросы Исаака
ограничение по времени на тест
4 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Вы достигли финального уровня популярной игры в жанре roguelike «Сочетания клавиш Исаака». Вместо босса вы встречаете торговца, у которого есть скрытый массив целых чисел $$$a_1, a_2, \ldots, a_n$$$, где $$$0 \leq a_i \lt 2^{30}$$$ для каждого $$$i$$$ в $$$[1, n]$$$.

Гарантируется, что массив сгенерирован случайным образом, то есть каждый $$$a_i$$$ ($$$1 \leq i \leq n$$$) является целым числом, независимо и равномерно выбранным из $$$[0, 2^{30})$$$, во всех тестах, кроме примера.

Обозначим $$$f(u, v) = a_u \oplus a_{u+1} \oplus \ldots \oplus a_v$$$, где $$$\oplus$$$ — это побитовый $$$\texttt{XOR}$$$.

Вы можете задавать запросы следующего вида: $$$\texttt{? u v}$$$, с $$$1 \leq u \leq v \leq n$$$.

Ответ на запрос:

  • $$$-1$$$, если $$$f(u, v) = 0$$$;
  • $$$\lfloor \log_2(f(u, v)) \rfloor$$$ в противном случае.

Каждый запрос стоит $$$\frac{1}{v-u+1}$$$ робокоина. В каждом тесте вам дается в общей сложности $$$300$$$ робокоинов, чтобы пройти не более $$$30$$$ наборов входных данных (то есть вы должны потратить в среднем $$$10$$$ робокоинов на один набор входных данных). Если ваш баланс когда-либо станет отрицательным, вы проиграете. Обратите внимание, что ваш баланс робокоинов не обязательно должен быть целым числом в любой момент времени.

Найдите ответы на все возможные $$$\frac{n(n+1)}{2}$$$ запросов, не проиграв.

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

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

Первая строка каждого набора входных данных содержит одно целое число $$$n$$$ ($$$n = 3$$$ или $$$n = 100$$$) — длина массива $$$a_1, a_2, \ldots, a_n$$$. Гарантируется, что массив сгенерирован случайным образом во всех наборах входных данных, кроме примера.

В этой задаче ровно $$$50$$$ тестов (включая пример). В примере $$$t = 1$$$ и $$$n = 3$$$, а во всех остальных тестах $$$t = 30$$$ и $$$n = 100$$$.

Взломы в этой задаче не допускаются.

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

Для каждого набора входных данных сначала прочитайте одно целое число $$$n$$$. Если прочитанное вами число равно $$$-2$$$, это означает, что ответ на предыдущий набор входных данных был неверным, и вы должны немедленно выйти.

Чтобы задать запрос, выведите строку в формате $$$\texttt{? u v}$$$, где $$$1 \leq u \leq v \leq n$$$.

Если вы сделали недопустимый запрос (т.е. формат неверен или вы достигли отрицательной суммы робокоинов), в ответ на запрос вы получите $$$-2$$$. В этом случае вы должны немедленно выйти. В противном случае вы получите ответ на запрос.

Когда вы определите ответы на все $$$\frac{n(n+1)}{2}$$$ запросов, выведите их в следующем формате.

Выведите $$$n+1$$$ строк. Первая строка должна содержать один символ $$$\texttt{!}$$$. $$$i$$$-я из следующих $$$n$$$ строк должна содержать $$$n-i+1$$$ целых чисел: ответы на запросы $$$\texttt{? i i}, \, \texttt{? i i+1}, \,\ldots, \, \texttt{? i n}$$$ соответственно.

После вывода запроса не забудьте вывести конец строки и сбросить вывод. В противном случае вы получите $$$\texttt{Idleness limit exceeded}$$$. Для этого используйте:

  • $$$\texttt{fflush(stdout)}$$$ или $$$\texttt{cout.flush()}$$$ в C++;
  • $$$\texttt{System.out.flush()}$$$ в Java;
  • $$$\texttt{stdout.flush()}$$$ в Python;
  • смотрите документацию для других языков.
Пример
Входные данные
1
3

2

-1

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


? 1 2

? 1 3

? 2 3

!
1 2 -1 
2 1 
2 
Примечание

В примере скрытый массив равен $$$[a_1, a_2, a_3] = [2, 4, 6]$$$.

  • Сначала вы спрашиваете $$$\texttt{? 1 2}$$$. Поскольку $$$f(1, 2) = a_1 \oplus a_2 = 6$$$, ответ равен $$$\lfloor \log_2(6) \rfloor = 2$$$.
  • Затем вы спрашиваете $$$\texttt{? 1 3}$$$. Поскольку $$$f(1, 3) = a_1 \oplus a_2 \oplus a_3 = 0$$$, ответ равен $$$-1$$$.
  • Затем вы спрашиваете $$$\texttt{? 2 3}$$$. Поскольку $$$f(2, 3) = a_2 \oplus a_3 = 2$$$, ответ равен $$$\lfloor \log_2(2) \rfloor = 1$$$.

Теперь, даже не зная скрытый массив, вы даёте ответ на все возможные $$$6$$$ запросов. Например, вы утверждаете, что ответ на $$$\texttt{? 1 1}$$$ равен $$$1$$$.

Вы потратили $$$1/2 + 1/3 + 1/2 = 4/3$$$ робокоинов, что меньше разрешенных $$$300$$$ робокоинов.