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

Задача . D. Более неправильно


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

Жюри загадало перестановку\(^\dagger\) \(p\) длины \(n\).

В один запрос можно выбрать два целых числа \(l\) и \(r\) (\(1 \le l < r \le n\)), заплатив за это \((r - l)^2\) монет. В ответ вы получите количество инверсий\(^\ddagger\) в подмассиве \([p_l, p_{l + 1}, \ldots p_r]\).

Найдите индекс максимального элемента в \(p\), потратив не более \(5 \cdot n^2\) монет.

Примечание: интерактор не является адаптивным: перестановка фиксируется до выполнения каких-либо запросов.

\(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

\(^\ddagger\) Количеством инверсий в массиве является количество пар индексов \((i,j)\) таких, что \(i < j\) и \(a_i > a_j\). Например, массив \([10,2,6,3]\) содержит \(4\) инверсии: \((1,2),(1,3),(1,4)\) и \((3,4)\).

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

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит единственное целое число \(n\) (\(2 \le n \le 2000\)) — длину скрытой перестановки \(p\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2000\).

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

Взаимодействие для каждого набора входных данных начинается с чтения целого числа \(n\).

Для формирования запроса выведите «? l r» (\(1 \le l < r \le n\)) без кавычек. После этого вы должны прочитать одно единственное целое число — ответ на ваш запрос.

Если вместо ответа или допустимого значения \(n\) вы получите целое число \(-1\), то это означает, что ваша программа сделала некорректный запрос, превысила лимит запросов или дала неверный ответ на предыдущем наборе входных данных. При получении вердикта «Неправильный ответ» ваша программа должна немедленно завершиться. В противном случае можно получить произвольный вердикт, поскольку решение будет продолжать считывать данные из закрытого потока.

Когда вы будете готовы дать окончательный ответ, выведите «! i» (\(1 \le i \le n\)) без кавычек — индекс максимума загаданной перестановки. После решения одного набора входных данных программа должна сразу же переходить к следующему. После решения всех наборов входных данных программа должна быть немедленно завершена.

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

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

Взломы

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

Первая строка содержит целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 2000\)) — длина скрытой перестановки \(p\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(p_1,p_2,\ldots, p_n\) (\(1 \le p_i \le n\)), причем \(p\) должно быть перестановкой.

Сумма \(n\) по всем наборам входных данных не должна превышать \(2000\).

Примечание

В первом тесте взаимодействие происходит следующим образом:

РешениеЖюриОбъяснение
2Имеется \(2\) набора входных данных.
4В первом наборе входных данных загадана перестановка \([1,3,2,4]\) длины \(4\).
? 1 3 1Решение запрашивает количество инверсий в подмассиве \([1,3,2]\), заплатив \(4\) монеты, а жюри отвечает \(1\).
? 3 4 0Решение запрашивает количество инверсий в подмассиве \([2,4]\), заплатив \(1\) монету, а жюри отвечает \(0\).
! 4 Решение каким-то образом определило, что \(p_4 = 4\), и выводит это. Поскольку ответ правильный, жюри переходит к следующему набору входных данных.
2Во втором наборе входных данных загадана перестановка \([2,1]\) длины \(2\).
? 1 2 1Решение запрашивает количество инверсий в подмассиве \([2,1]\), заплатив \(1\) монету, а жюри отвечает \(1\).
! 1 Решение каким-то образом определило, что \(p_1 = 2\), и выводит это. Поскольку ответ верен и наборов входных данных больше нет, жюри и решение завершаются.

Обратите внимание, что пустые строки во входных и выходных данных примера сделаны для наглядности и не встречаются в реальном взаимодействии.


Примеры
Входные данныеВыходные данные
1 2
4

1

0

2

1
? 1 3

? 3 4

! 4

? 1 2

! 1

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

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