E. ace5 и порядок задач
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

В новом раунде было $$$n$$$ задач, сложности от $$$1$$$ до $$$n$$$. Координатор, решив сделать первый раунд с неотсортированными по сложности задачами, переставил задачи, получив перестановку сложностей от $$$1$$$ до $$$n$$$. После этого координатор предложил ace5 угадать перестановку следующим образом.

Координатор загадывает число $$$x$$$ от $$$1$$$ до $$$n$$$.

ace5 может делать запросы типа: $$$?\ i$$$. Ответом будет:

  • $$$>$$$, если $$$a_i > x$$$, после этого $$$x$$$ увеличивается на $$$1$$$.
  • $$$<$$$, если $$$a_i < x$$$, после этого $$$x$$$ уменьшается на $$$1$$$.
  • $$$=$$$, если $$$a_i = x$$$, после этого $$$x$$$ не меняется.

Задача ace5 — отгадать перестановку не более чем за $$$40n$$$ запросов. Так как ace5 слишком занят написанием анонса, он поручил эту задачу Вам.

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

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

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

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

Чтобы сделать запрос, выведите строку в формате «? i», где $$$1 \leq i \leq n$$$.

В качестве ответа вы получите:

  • «>», если $$$a_i$$$ > $$$x$$$, после этого $$$x$$$ увеличится на $$$1$$$.
  • «<», если $$$a_i$$$ < $$$x$$$, после этого $$$x$$$ уменьшится на $$$1$$$.
  • «=», если $$$a_i$$$ = $$$x$$$, после этого $$$x$$$ не изменится.

Вы можете сделать не более $$$40n$$$ запросов. Чтобы вывести ответ, необходимо напечатать «! a_1 a_2 ... a_n», где $$$1 \leq a_i \leq n$$$, все они различны. Вывод ответа не считается за запрос.

Если ваша программа сделает более $$$40n$$$ запросов для одного набора входных данных, или сделает некорректный запрос, то ответом на запрос будет -1, после получения такого ответа ваша программа должна немедленно завершится, чтобы получить вердикт Неправильный ответ. Иначе она может получить любой другой вердикт.

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

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

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

Взломы:

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

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

Описание каждого тестового случая должно состоять из двух строк. В первой строке находятся числа $$$n$$$ и $$$x$$$ ($$$1 \leq x \leq n \leq 2000$$$) — длина загаданной перестановки и изначальное значение числа $$$x$$$. Во второй строке находятся $$$n$$$ различных чисел $$$a_1, a_2, \ldots, a_n$$$ ($$$1 \leq a_i \leq n$$$) — перестановка, которую должно загадать жюри в данном тестовом случае.

Сумма $$$n$$$ по всем запросам не должна превосходить $$$2000$$$.

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

>

=

<

=

<

<

2

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

? 2

? 1

? 5

? 1

? 3

! 2 4 1 5 3

? 1

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

В первом тесте загадана перестановка $$$a$$$ = [$$$2,4,1,5,3$$$], и значение $$$x$$$ изначально равно $$$3$$$.

Во втором тесте загадана перестановка $$$a$$$ = [$$$2,1$$$], $$$x$$$ изначально равен $$$1$$$.