C. Скрытые перестановки
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

Жюри загадало перестановку $$$p$$$ длины $$$n$$$ и предлагает Вам её угадать. Для этого жюри создало перестановку $$$q$$$ длины $$$n$$$. Изначально $$$q$$$ является тождественной ($$$q_i = i$$$ для всех $$$i$$$).

За один запрос Вы можете узнать $$$q_i$$$ для любого $$$i$$$. После каждого Вашего запроса жюри будет изменять $$$q$$$ следующим образом:

  • Сначала жюри создаст перестановку $$$q'$$$ длины $$$n$$$ такую что $$$q'_i = q_{p_i}$$$ для всех $$$i$$$.
  • После этого жюри заменит $$$q$$$ на $$$q'$$$.

Вы можете сделать не более $$$2n$$$ запросов, чтобы угадать перестановку $$$p$$$.

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

В первой строке задано одно целое число $$$t$$$ ($$$1 \leq t \leq 1000$$$) — количество тестовых случаев.

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

Взаимодействие Вашей программы с программой жюри в каждом тестовом случае начинается со считывания числа $$$n$$$ ($$$1 \leq n \leq 10^4$$$) — длины перестановок $$$p$$$ и $$$q$$$.

Чтобы узнать значение $$$q_i$$$, выведите запрос в формате $$$?$$$ $$$i$$$ ($$$1 \leq i \leq n$$$). После этого, программа жюри выведет значение $$$q_i$$$.

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

Когда Вы будете готовы сообщить $$$p$$$, выведите $$$p$$$ в формате $$$!$$$ $$$p_1$$$ $$$p_2$$$ $$$\ldots$$$ $$$p_n$$$. После этого следует приступать к обработке следующего тестового случая или завершить программу, если это был последний тестовый случай. Вывод перестановки не считается как один из $$$2n$$$ запросов.

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

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

Гарантируется, что сумма $$$n$$$ по всем тестовым случаям не превосходит $$$10^4$$$. Интерактор в этой задаче не является адаптивным.

Взломы:

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

В первой строке находится одно целое число $$$t$$$ — количество тестовых случаев.

Описание каждого тестового случая должно состоять из двух строк. В первой строке находится число $$$n$$$ — длина перестановок $$$p$$$ и $$$q$$$. Во второй строке находятся $$$n$$$ чисел $$$p_1, p_2, \ldots, p_n$$$ — перестановка, которую должно загадать жюри в данном тестовом случае.

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

3

2

1

4

2

4

4
Выходные данные
? 3

? 2

? 4

! 4 2 1 3

? 2

? 3

? 2

! 1 3 4 2
Примечание

В первом тестовом случае жюри загадало перестановку $$$p = [4, 2, 1, 3]$$$.

Перед первым Вашим запросом $$$q = [1, 2, 3, 4]$$$, ответ на запрос будет равен $$$q_3 = 3$$$.

Перед вторым Вашим запросом $$$q = [4, 2, 1, 3]$$$, ответ на запрос будет равен $$$q_2 = 2$$$.

Перед третьим Вашим запросом $$$q = [3, 2, 4, 1]$$$, ответ на запрос будет равен $$$q_4 = 1$$$.

Во втором тестовом случае жюри загадало перестановку $$$p = [1, 3, 4, 2]$$$.

Пустые строки в примере даны только для улучшения читаемости. В тестирующей системе программа жюри не будет выводить пустые строки.