G. Гайки и болты
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

У Стивена есть $$$n$$$ гаек и $$$n$$$ болтов. Все гайки имеют разный размер от 1 до $$$n$$$, и все болты имеют разный размер от 1 до $$$n$$$.

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

Вы должны помочь Стивену осуществить задуманное, затратив не более $$$5 n \log_{2}n$$$ действий.

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

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

В самом начале вашей программе сообщается целое число $$$n$$$ ($$$2 \le n \le 1000$$$) — количество гаек и болтов.

После этого вы можете сделать не более $$$5 n \log_{2}n$$$ запросов. Чтобы сделать запрос, выведите символ «?», а затем через пробел числа $$$i$$$ и $$$j$$$ ($$$1 \le i \le n, 1 \le j \le n$$$) — номер гайки и номер болта, которые Стивен попробует сравнить.

В ответ на такой запрос вы получите один из трех символов:

  • «<», если размер $$$i$$$-й гайки меньше, чем размер $$$j$$$-го болта,
  • «=», если размер $$$i$$$-й гайки равен размеру $$$j$$$-го болта,
  • «>», если размер $$$i$$$-й гайки больше, чем размер $$$j$$$-го болта.

Как только вы сможете сказать, какая гайка подходит на какой болт, выведите символ «!», а через пробел $$$n$$$ различных целых чисел $$$p_i$$$ ($$$1 \le p_i \le n$$$), где $$$p_i$$$ — это номер болта, на который подходит гайка с номером $$$i$$$. После этого ваша программа должна завершиться.

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

<

<

>

>

<

=

=

=

=

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

? 1 1

? 2 2

? 3 3

? 4 4

? 5 5

? 1 4

? 2 3

? 3 2

? 4 5

? 5 1

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

Обратите внимание, что каждое выведенное вами сообщение должно завершаться переводом строки. Также после вывода каждого сообщения ваша программа должна очищать потоковый буфер, чтобы выведенная вами информация дошла до программы жюри: например, это делают вызовы «fflush(stdout)» или «cout.flush()» в C++, «System.out.flush()» в Java, «Console.Out.Flush()» в C#, «flush(output)» в Pascal, «sys.stdout.flush()» в Python.

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