F. Рудольф и игра в наперстки
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

Рудольф предложил Бернарду сыграть в наперстки, но не совсем обычные. Он выложил в ряд $$$N$$$ наперстков, положил под два из них по шарику и перемешал. После этого Бернард должен был назвать номера наперстков, под которыми находятся шарики. Но Бернард был усталый и не смог уследить за Рудольфом.

Чтобы Бернард не расстроился Рудольф предложил по-другому угадать номера наперстков. Он разрешил Бернарду сделать $$$50$$$ запросов вида «? L R» $$$(1 \le L \le R \le N)$$$. В ответ на каждый запрос Рудольф ответит, сколько шариков находится под наперстками в диапазоне от $$$L$$$ до $$$R$$$.

Бернард боится упасть в глазах Рудольфа, если не решит и эту задачу. Поэтому он попросил Вас помочь ему.

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

Первая строка содержит одно целое число $$$N$$$ $$$(2 \leq N \leq 10^6)$$$ — количество наперстков.

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

Выведите в стандартный поток строку вида «! X Y», где $$$X, Y (1 \le X \lt Y \le N)$$$ — позиции наперстков, под которыми находятся шарики.

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

Чтобы сделать запрос, выведите в стандартный поток строку вида «? L R» $$$(1 \le L \le R \le N)$$$. После этого выведите перевод строки и выполните операцию $$$flush$$$.

В ответ на запрос придёт одно целое число — количество шариков в диапазоне от $$$L$$$ до $$$R$$$.

Чтобы вывести ответ на задачу, выведите в стандартный поток строку вида «! X Y», где $$$X, Y (1 \le X \lt Y \le N)$$$ — позиции наперстков, под которыми находятся шарики, и завершите программу.

Если вы сделаете более $$$50$$$ запросов вида «? L R» или сделаете некорректный запрос, решение получит вердикт «Неправильный ответ».

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

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

  • cout.flush() или fflush(stdout) в C++;
  • System.out.flush() в Java;
  • stdout.flush() в Python;
  • flush(output) в Pascal;
Пример
Входные данные
10

1

1

2

1

0
Выходные данные
? 2 4

? 3 3

? 2 10

? 5 6

? 6 6

! 3 5