这是一个交互式问题。
隐藏着一个长度为 $n=30000$ 的排列 $p$。你的任务是找出这个排列中最小值所在的下标。
评测器是非自适应的:排列在交互开始前确定,并且之后不会改变。
与普通的比较查询不同,评测器只会将你当前的查询与前一次查询进行比较。具体来说,如果你上一次查询的下标是 $i$,现在你查询下标 $j$,评测器会告诉你 $p_i$ 与 $p_j$ 的比较结果。
你最多可以进行 $q_{\max}=42000$ 次查询。
官方评测数据包含 100 个独立的测试文件。你的程序会独立地在每个文件上运行。
交互
在交互开始时,你的程序必须读入两个整数
$$ n \quad q_{\max}. $$
对于官方测试,$n=30000$,$q_{\max}=42000$。
要发起一次查询,请按以下格式输出一行:
$$ \text{? j} $$
其中 $1 \le j \le n$。
评测器会回复一个字符:
<如果 $p_i < p_j$,其中 $i$ 表示上一次查询的下标(如果存在);=如果这是第一次查询,或者 $p_i = p_j$;>如果 $p_i > p_j$,其中 $i$ 表示上一次查询的下标(如果存在)。
由于 $p$ 是一个排列,在第一次查询之后,只有当你查询的下标与上一次查询的下标相同时,才会收到回复 =。
如果评测器回复 -1,你的程序必须立即终止。这意味着你的程序违反了交互协议,将会得到 Wrong Answer。
要给出最终答案,请按以下格式输出一行:
$$ \text{! a} $$
其中 $a$ 是你认为包含最小值的下标。输出答案后,你的程序必须终止。最终答案不计入查询次数。
如果你的程序进行的查询次数超过 $q_{\max}$,查询了无效的下标,输出了无效的命令,或者输出了错误的最终答案,将会得到 Wrong Answer。
每次输出查询或答案后,请刷新输出缓冲区。例如,在 C++ 中可以使用 endl 或 cout.flush()。
说明
本样例仅用于展示交互过程,不会出现在实际测试数据中。形式为 (receiving ... output) 的行是占位符,用于在对齐样例中的查询和评测器回复。在实际测试中,评测器不会输出这些占位行,选手也不应该读入或打印它们。
在此样例交互中,隐藏的排列为 $p=(3,1,4,2)$。下面的项目符号描述了样例中展示的交互过程。
- 评测器首先发送 $n=4$ 和查询上限 $5$。
- 第一次查询
? 1收到=,因为之前没有查询过的下标。 - 查询
? 2比较 $p_1=3$ 与 $p_2=1$,所以评测器回复>。 - 查询
? 4比较 $p_2=1$ 与 $p_4=2$,所以评测器回复<。最小值在下标 $2$ 处,因此! 2是正确的。
本地交互工具: 附件的 attachments/local_interactive.py 可以通过 --perm 3,1,4,2 --limit 5 来复现这个本地环境,但通过它并不保证能通过官方评测数据。