A. В поисках локального минимума
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

Гомеру очень нравятся массивы, и он хочет поиграть с вами в игру. Гомер загадал перестановку $$$a_1, a_2, \dots, a_n$$$ чисел от $$$1$$$ до $$$n$$$. Вас просят найти любой индекс $$$k$$$ ($$$1 \leq k \leq n$$$), который является локальным минимумом.

Для массива $$$a_1, a_2, \dots, a_n$$$ индекс $$$i$$$ ($$$1 \leq i \leq n$$$) считается локальным минимумом, если $$$a_i < \min\{a_{i-1},a_{i+1}\}$$$, где $$$a_0 = a_{n+1} = +\infty$$$. Массив называется перестановкой чисел от $$$1$$$ до $$$n$$$, если он содержит все целые числа от $$$1$$$ до $$$n$$$ ровно один раз.

Изначально вам дается только значение $$$n$$$ без какой-либо другой информации об этой перестановке. На каждом шаге взаимодействия вы можете выбрать любой индекс $$$i$$$ ($$$1 \leq i \leq n$$$) и сделать с ним запрос. В ответ вы получите значение $$$a_i$$$.

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

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

Вы начинаете взаимодействие с чтения целого числа $$$n$$$ ($$$1\le n \le 10^5$$$) в отдельной строке.

Чтобы сделать запрос с индексом $$$i$$$ ($$$1 \leq i \leq n$$$), необходимо в отдельной строке вывести «? $$$i$$$». Затем считайте в отдельной строке значение $$$a_i$$$. Количество запросов «?» должно не превышать $$$100$$$.

Чтобы вывести индекс $$$k$$$ ($$$1 \leq k \leq n$$$), который является локальным минимумом, выведите «! $$$k$$$» в отдельной строке и завершите вашу программу.

В случае, если ваш запрос имеет неверный формат, или вы сделали более $$$100$$$ запросов типа «?», вы получите вердикт Неправильный ответ.

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

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

Формат взломов

Первая строка взлома должна содержать единственное целое число $$$n$$$ ($$$1 \leq n \leq 10^5$$$).

Вторая строка должна содержать попарно различные целые числа $$$n$$$ $$$a_1, a_2, \dots, a_n$$$ ($$$1 \leq a_i \leq n$$$).

Пример
Входные данные
5
3
2
1
4
5
Выходные данные
? 1
? 2
? 3
? 4
? 5
! 3
Примечание

В примере в первой строке содержится целое число $$$5$$$, указывающее на то, что длина массива составляет $$$n = 5$$$.

В примере делается пять запросов «?», после которых мы делаем вывод, что массив равен $$$a = [3,2,1,4,5]$$$ и $$$k = 3$$$ является локальным минимумом.