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

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

Дан отсортированный по возрастанию односвязный список. Необходимо найти в нем минимальное число, большее или равное x.

Более формально, есть односвязный список, построенный на массиве из n элементов. Ячейка с индексом i хранит два целых числа: valuei — значение в данной ячейке, и nexti — индекс следующей ячейки односвязного списка (либо -1, если текущая ячейка последняя). Список отсортирован, то есть если nexti ≠  - 1, то valuenexti > valuei.

Вам дано количество элементов списка n, индекс его первой ячейки start и число x.

Вы можете сделать до 2000 запросов двух типов:

  • ? i (1 ≤ i ≤ n) — узнать, чему равны значение valuei и nexti,
  • ! ans — выдать ответ на задачу: минимальное число, большее или равное x, либо ! -1, в случае, когда таких чисел нет. После этого запроса необходимо завершить программу.

Напишите программу, которая решает данную задачу.

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

Первая строка входных данных содержит три целых числа n, start, x (1 ≤ n ≤ 50000, 1 ≤ start ≤ n, 0 ≤ x ≤ 109) — число элементов в списке, индекс первого элемента и число x.

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

Чтобы вывести ответ на задачу, выведите его в формате ! ans, где ans — минимальное число в списке, большее или равное x, или -1, если такого числа нет.

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

Чтобы задать запрос первого типа, выведите ? i (1 ≤ i ≤ n), где i — номер ячейки, про которую вы хотите узнать информацию.

После каждого запроса типа ? считайте два целых числа valuei и nexti (0 ≤ valuei ≤ 109,  - 1 ≤ nexti ≤ n, nexti ≠ 0).

Гарантируется, что если nexti ≠  - 1, то valuenexti > valuei, и что массив задает корректный односвязный список с началом в start.

Обратите внимание, что вы можете сделать не более 1999 запросов типа ?.

Если nexti =  - 1 и valuei =  - 1, это означает, что вы превысили максимальное число запросов или сделали некорректный запрос. Ваша программа должна немедленно завершиться (например, вызовом exit(0)). Вы получите вердикт «Неправильный ответ», и это будет означать, что вы превысили максимальное число запросов или задали некорректный запрос. Если вы проигнорируете это, то можете получить любой вердикт, так как ваша программа продолжит читать из закрытого потока ввода.

Выше решение получит вердикт «Решение зависло», если вы не будете ничего выводить или забудете сделать операцию flush после вывода вопроса или ответа.

Чтобы выполнить операцию flush, можете использовать (сразу после вывода запроса и перевода строки):

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

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

Для взломов необходимо использовать следующий формат:

В первой строке выведите три числа n, start, x (1 ≤ n ≤ 50000, 1 ≤ start ≤ n, 0 ≤ x ≤ 109).

В следующих n строках выведите описание ячеек списка: в i-й выведите два целых числа valuei и nexti (0 ≤ valuei ≤ 109,  - 1 ≤ nexti ≤ n, nexti ≠ 0).

Данная структура должна быть корректным односвязным списком. В частности, из ячейки start должно было возможно посетить все ячейки, двигаясь в следующую ячейку nexti, а последняя ячейка end должна содержать -1 в качестве nextend.

Пример
Входные данные
5 3 80
97 -1
58 5
16 2
81 1
79 4
Выходные данные
? 1
? 2
? 3
? 4
? 5
! 81
Примечание

Информацию об односвязном списке можно узнать по ссылке

Иллюстрация массива в примере из условия. Темной рамкой выделены стартовая и конечная вершины.