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

Задача . G. Найди подарок


Это интерактивная задача. Не забывайте при выводе запросов сбрасывать буфер с помощью cout.flush() или fflush(stdout) в C++ и аналогичных функций в других языках программирования.

На столе стоят \(n\) коробок с подарками, пронумерованные от \(1\) по \(n\) слева направо. Известно, что ровно в \(k\) из них лежат ценные подарки — в остальных просто камешки на удачу. Выглядят все коробки одинаково и отличить их можно только по весу. Все коробки с камнями весят одинаково и строго больше, чем коробки с ценными подарками. Массы коробок с подарками же могут как совпадать, так и различаться между собой.

Вы можете сделать не более \(50\) запросов (без учета вывода ответа). Каждым запросом вы можете сравнить массы двух непересекающихся подмножеств коробок \(a_1, a_2, \dots, a_{k_a}\) и \(b_1, b_2, \dots, b_{k_b}\) на чашечных весах. В ответ вы получите один из четырех вариантов:

  • FIRST, если подмножество \(a_1, a_2, \dots, a_{k_a}\) тяжелее;
  • SECOND, если подмножество \(b_1, b_2, \dots, b_{k_b}\) тяжелее;
  • EQUAL, если массы подмножеств совпадают;
  • WASTED, если запрос некорректен или превышено количество запросов.

Используя данные запросы (или просто интуицию), определите коробку с ценным подарком с минимальным номером.

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

Входные данные состоят из нескольких наборов. В начале вам выдается целое число \(T\) (\(1 \le T \le 500\)) — количество наборов входных данных.

В начале каждого набора вам выдаются два целых числа \(n\) и \(k\) (\(2 \le n \le 1000\), \(1 \le k \le \frac{n}{2}\)) — количество коробок в ряду и количество с ценными подарками среди них.

Гарантируется, что порядок коробок в каждом наборе фиксирован и сумма \(n\) по всем наборам не превосходит \(1000\).

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

Для каждого набора входных данных выведите минимальный номер коробки, содержащей ценный подарок, в следующем формате: «! \(x\)», где \(x\) (\(1 \le x \le n\)) — искомый номер.

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

Выводите каждый запрос в три строки. В первой строке выводите размеры подмножеств в следующем формате: «? \(k_a\) \(k_b\)», где \(k_a\) и \(k_b\) (\(1 \le k_a, k_b \le n\); \(k_a + k_b \le n\)) — их соответствующие размеры.

Во второй строке выведите \(k_a\) целых чисел \(a_1, a_2, \dots, a_{k_a}\) (\(1 \le a_i \le n\); \(a_i \neq a_j\) при \(i \neq j\)) — номера коробок в первом подмножестве.

В третьей строке выведите \(k_b\) целых чисел \(b_1, b_2, \dots, b_{k_b}\) (\(1 \le b_i \le n\); \(b_i \neq b_j\) при \(i \neq j\)) — номера коробок во втором подмножестве.

Подмножества не должны пересекаться, то есть \(a_i \neq b_j\) для всех \(i\) и \(j\).

В ответ будет получен один из четырех вариантов, описанных выше. В случае получения WASTED завершите работу программы во избежание получения вердиктов тестирования, отличных от Wrong Answer.

Примечание

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

Взломы в данной задаче запрещены.


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

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

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