| Codeforces Round 1066 (Div. 1 + Div. 2) |
|---|
| Закончено |
Вы достигли финального уровня популярной игры в жанре 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$$$.
Ответ на запрос:
Каждый запрос стоит $$$\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}$$$. Для этого используйте:
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]$$$.
Теперь, даже не зная скрытый массив, вы даёте ответ на все возможные $$$6$$$ запросов. Например, вы утверждаете, что ответ на $$$\texttt{? 1 1}$$$ равен $$$1$$$.
Вы потратили $$$1/2 + 1/3 + 1/2 = 4/3$$$ робокоинов, что меньше разрешенных $$$300$$$ робокоинов.
| Название |
|---|


