Олимпиадный тренинг

Задача . A. В поисках локального минимума


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

Гомеру очень нравятся массивы, и он хочет поиграть с вами в игру. Гомер загадал перестановку \(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\), указывающее на то, что длина массива составляет \(n = 5\).

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


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

time 2000 ms
memory 512 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
Комментарий учителя