E. Два дома
ограничение по времени на тест
3.5 секунд
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Это интерактивная задача. Не забывайте о том, что ваша программа должна каждый раз после вывода запроса сбрасывать буфер вывода. Для сброса буфера вывода можно использовать fflush(stdout) в C++, system.out.flush() в Java, stdout.flush() в Python или flush(output) в Pascal. Если вы используете другой язык программирования, посмотрите в его документации, как выполняется эта операция. Также рекомендуем вам прочесть руководство по интерактивным задачам: https://codeforces.com/blog/entry/45307.

Диксит живет в городе, в котором $$$n$$$ домов. Между каждой парой домов есть ровно одна направленная дорога. То есть для любой пары домов A и B есть либо дорога от дома A к дому B, либо дорога от B к A (но только одна из них). К $$$i$$$-му дому ведут $$$k_i$$$ дорог.

Два дома A и B являются взаимно достижимыми, если дом A достижим из дома B (существует путь от дома A к дому B по дорогам), и дом B достижим из дома A.

Диксит хочет купить в этом городе два дома, один для того, чтобы жить в нем, другой — для учебы. Естественно, он бы хотел, чтобы от каждого из этих домов можно было добраться до другого дома, то есть ему нужно найти пару взаимно достижимых домов. Если таких пар несколько, Диксит хочет максимизировать величину $$$|k_A - k_B|$$$, где $$$k_i$$$ — количество дорог, ведущих к дому $$$i$$$. Если существует более одной оптимальной пары, подойдет любая из них.

Так как Диксит занят подготовкой CodeCraft, он просит вас помочь ему найти два таких дома, или сообщить, что таких домов нет.

Во входных данных задачи вам не задаются направления дорог. Вы знаете только количество дорог, идущих к каждому дому ($$$k_i$$$).

Вы можете задавать запросы следующих типов: вы выводите пару домов A и B, и жюри ответит, есть ли путь от дома A к дому B. В этой задаче нет никакого явного ограничения на количество запросов, которые вы можете задать. Но нельзя задавать запросы после того, как жюри ответит «Yes» на один из ваших запросов. Кроме того, нельзя задавать один и тот же запрос дважды.

Как только вы зададите все необходимые запросы (или жюри ответит «Yes» на один из них), ваша программа должна вывести ответ и завершиться.

Прочтите раздел «Протокол взаимодействия» для того, чтобы получить более подробную информацию о взаимодействии.

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

В первой строке задано одно целое число $$$n$$$ ($$$3 \le n \le 500$$$) — количество домов в городе. Во второй строке заданы $$$n$$$ целых чисел $$$k_1, k_2, \dots, k_n$$$ ($$$0 \le k_i \le n - 1$$$), $$$i$$$-е из которых равно кол-ву дорог, идущих к $$$i$$$-му дому.

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

Чтобы задать запрос, выведите «? A B» $$$(1 \leq A,B \leq N, A\neq B)$$$. Программа жюри ответит «Yes», если есть путь от дома A к дому B, или «No», если пути нет.

Чтобы дать ответ на задачу, выведите «! A B», где A и B — номера двух различных домов, достижимых друг из друга, с максимально возможной величиной $$$|k_A - k_B|$$$. Если такой пары домов не существует, выведите «! 0 0».

После вывода ответа ваша программа должна завершиться, иначе вы получите вердикт «Неправильный ответ».

Вы не можете задавать один и тот же запрос дважды. Нет никакого ограничения на количество запросов, но вы не можете задавать запросы после получения ответа «Yes». После этого ваша программа сразу должна вывести ответ на задачу («! A B» или «! 0 0») и завершиться.

Если вы зададите запрос в неправильном формате или зададите один и тот же запрос дважды, вы получите вердикт «Неправильный ответ».

После вывода запроса не забудьте вывести символ конца строки и сбросить буфер вывода (иначе вы можете получить вердикт «Решение зависло»). В различных языках программирования сброс буфера вывода реализован следующим образом:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • для других языков посмотрите их документацию.
Примеры
Входные данные
3
1 1 1
Yes
Выходные данные
? 1 2
! 1 2
Входные данные
4
1 2 0 3
No
No
No
No
No
No
Выходные данные
? 2 1
? 1 3
? 4 1
? 2 3
? 4 2
? 4 3
! 0 0
Примечание

В первом примере нам задан город с тремя домами, в каждый из которых ведет по одной дороге. Решение участника задает запрос «? 1 2», чтобы узнать, можно ли от дома $$$1$$$ добраться до дома $$$2$$$. Программа жюри отвечает «Yes». После этого решение участника выводит ответ «! 1 2» и завершается.

Во втором примере решение участника делает шесть различных запросов, убеждается в том, что пары домов, достижимых друг из друга, нет, и выводит «! 0 0» в качестве ответа.