B. Граф сумм
ограничение по времени на тест
3 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

Загадана перестановка $$$p_1, p_2, \dots, p_n$$$.

Рассмотрим неориентированный граф с $$$n$$$ вершинами и без рёбер. Вы можете делать два типа запросов:

  1. Укажите целое число $$$x$$$ такое, что $$$2 \le x \le 2n$$$. Тогда для всех целых чисел $$$i$$$ ($$$1 \le i \le n$$$) таких, что $$$1 \le x-i \le n$$$, будет добавлено ребро между вершинами $$$i$$$ и $$$x-i$$$.
  2. Запросить число рёбер в кратчайшем пути между вершинами $$$p_i$$$ и $$$p_j$$$. В качестве ответа вы получите количество рёбер на кратчайшем пути, если такой путь существует, или $$$-1$$$, если такого пути нет.

Обратите внимание, что вы можете делать оба типа запросов в любом порядке.

Сделав $$$2n$$$ запросов (включая тип $$$1$$$ и тип $$$2$$$), угадайте две возможные перестановки, хотя бы одна из которых равна $$$p_1, p_2, \dots, p_n$$$. Ваш ответ будет засчитан, если хотя бы одна из перестановок верна. Вы можете вывести одну и ту же перестановку дважды.

Перестановкой длины $$$n$$$ является массив, состоящий из $$$n$$$ различных целых чисел от $$$1$$$ до $$$n$$$ в произвольном порядке. Например, $$$[2,3,1,5,4]$$$ — перестановка, но $$$[1,2,2]$$$ не перестановка ($$$2$$$ встречается в массиве дважды) и $$$[1,3,4]$$$ тоже не перестановка ($$$n=3$$$, но в массиве встречается $$$4$$$).

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

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

Первая строка каждого набора входных данных содержит единственное целое число $$$n$$$ ($$$2 \le n \le 10^3$$$) — длина перестановки.

Гарантируется, что сумма $$$n$$$ по всем наборам входных данных не превосходит $$$10^3$$$.

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

Взаимодействие для каждого набора входных данных начинается после считывания $$$n$$$.

Затем, сделайте не более $$$2n$$$ запросов:

  • Если вы хотите сделать запрос типа $$$1$$$, выведите «+ x». $$$x$$$ должно быть целым числом от $$$2$$$ до $$$2n$$$ включительно. После этого считайте $$$1$$$ или $$$-2$$$. Если вы считали $$$1$$$, то ваш запрос был корректным, иначе он был некорректным или вы превысили количество запросов, и ваша программа должна немедленно завершиться, чтобы получить вердикт Неправильный ответ.
  • Если вы хотите сделать запрос типа $$$2$$$, выведите «? i j». $$$i$$$ и $$$j$$$ должны быть целыми числами от $$$1$$$ до $$$n$$$ включительно. После этого, считайте единственное целое число $$$r$$$ ($$$-1 \le r \le n$$$) — ответ на ваш запрос. Если вы получили число $$$−2$$$ вместо ответа, то ваша программа сделала некорректный запрос или превысила число запросов. Ваша программа должна немедленно завершиться для получения вердикта Неправильный ответ.

В любой момент взаимодействия, если вы хотите угадать две перестановки, выведите «! $$$p_{1,1}$$$ $$$p_{1,2}$$$ $$$\dots$$$ $$$p_{1,n}$$$ $$$p_{2,1}$$$ $$$p_{2,2}$$$ $$$\dots$$$ $$$p_{2,n}$$$». Обратите внимание, что вы должны выводить две перестановки на одной и той же строке и без восклицательного знака между перестановками. После этого считайте $$$1$$$ или $$$-2$$$. Если вы считали $$$1$$$, то ваш ответ был правильным, иначе он был неправильным, и ваша программа должна немедленно завершиться, чтобы получить вердикт Неправильный ответ. После этого, перейдите к следующему набору входных данных, или завершите программу, если такого нет. Обратите внимание, что вывод ответа не считается как запрос.

Обратите внимание, что даже если вы вывели правильную перестановку, вторая перестановка должна быть именно перестановкой, а не произвольным массивом.

В любой момент, если вы продолжите взаимодействие после считывания числа $$$-2$$$, вы можете получить любой вердикт, так как программа продолжит чтение из закрытого потока.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Интерактор является неадаптивным. Это означает, что все перестановки зафиксированы до начала взаимодействия.

Взломы

Чтобы сделать взлом, используйте следующий формат.

Первая строка должна содержать единственное целое число $$$t$$$ ($$$1 \le t \le 100$$$) — количество наборов входных данных.

Первая строка каждого набора входных данных должна содержать единственное целое число $$$n$$$ ($$$2 \le n \le 10^3$$$) — длину перестановки.

Вторая строка каждого набора входных данных должна содержать $$$n$$$ различных целых чисел $$$p_1, p_2, \ldots, p_n$$$ ($$$1 \le p_i \le n$$$) — загаданную перестановку.

Сумма $$$n$$$ по всем наборам входных данных не превосходит $$$10^3$$$.

Пример
Входные данные
2
6

1

1

1

1

1

2

-1

1
2

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


+ 12

+ 2

+ 3

? 1 3

+ 5

? 1 5

? 4 5

! 1 4 2 5 3 6 1 2 3 4 5 6


! 1 2 2 1

Примечание

В первом наборе входных данных $$$n=6$$$ и загадана перестановка $$$p = [1,4,2,5,3,6]$$$.

Сначала сделаем запросы типа $$$1$$$ с $$$x=12, 2, 3$$$ соответственно. Это суммарно добавит в граф четыре ребра:

  • Ребро, соединяющее вершины $$$6$$$ и $$$6$$$.
  • Ребро, соединяющее вершины $$$1$$$ и $$$1$$$.
  • Ребро, соединяющее вершины $$$1$$$ и $$$2$$$.
  • Ребро, соединяющее вершины $$$2$$$ и $$$1$$$.

Поскольку все эти запросы корректны, интерактор вернул $$$1$$$ после каждого из них.

Затем спросим количество рёбер на кратчайшем пути между вершинами $$$p_1 = 1$$$ и $$$p_3 = 2$$$, которое равно $$$1$$$.

Затем сделаем запрос типа $$$1$$$ с $$$x=5$$$. Это суммарно добавит в граф четыре ребра:

  • Ребро, соединяющее вершины $$$1$$$ и $$$4$$$.
  • Ребро, соединяющее вершины $$$2$$$ и $$$3$$$.
  • Ребро, соединяющее вершины $$$3$$$ и $$$2$$$.
  • Ребро, соединяющее вершины $$$4$$$ и $$$1$$$.

Поскольку этот запрос корректен, интерактор вернул $$$1$$$.

Затем спросим количество рёбер на кратчайшем пути между вершинами $$$p_1 = 1$$$ и $$$p_5 = 3$$$, которое равно $$$2$$$.

Затем спросим количество рёбер на кратчайшем пути между вершинами $$$p_4 = 5$$$ и $$$p_5 = 3$$$. Такого пути не существует, поэтому интерактор вернёт $$$-1$$$.

После этого, благодаря некоторой магии, две возможные перестановки, которые могут быть равны $$$p$$$, определены: первая перестановка равна $$$[1,4,2,5,3,6]$$$, и вторая перестановка равна $$$[1,2,3,4,5,6]$$$. Так как первая перестановка равна загаданной перестановке, этот набор входных данных решён корректно. Всего $$$7$$$ запросов использовано, что находится в пределах $$$2 \cdot 6 = 12$$$ запросов.

Поскольку ответ правильный, интерактор вернул $$$1$$$.

Во втором наборе входных данных $$$n=2$$$ и загадана перестановка $$$p = [2,1]$$$.

Так как есть только $$$2! = 2$$$ возможные перестановки, никаких запросов не требуется. Достаточно просто вывести две перестановки $$$[1,2]$$$ и $$$[2,1]$$$. Всего $$$0$$$ запросов использовано, что находится в пределах $$$2 \cdot 2 = 4$$$ запросов.

Поскольку ответ правильный, интерактор вернул $$$1$$$.