#CF1936A. 位操作向导

位操作向导

A. 按位运算 wizard

每个测试的时间限制: 22
每个测试的内存限制: 256256 兆字节

这是一个交互问题。
存在一个秘密序列 p0,p1,,pn1p_0, p_1, \dots, p_{n-1},它是 {0,1,,n1}\{0,1,\dots,n-1\} 的一个排列。

你需要找到任意两个下标 iijj,使得 pipjp_i \oplus p_j 最大,其中 \oplus 表示按位异或运算。

为此,你可以进行查询。每个查询的形式如下:你选择任意下标 a,b,c,da, b, c, d0a,b,c,d<n0 \le a, b, c, d < n)。然后评测系统计算 x=(papb)x = (p_a \mid p_b)y=(pcpd)y = (p_c \mid p_d),其中 \mid 表示按位或运算。最后,你会收到 xxyy 的比较结果。换句话说,你会被告知 x<yx < yx>yx > y 还是 x=yx = y

请找出任意两个下标 iijj0i,j<n0 \le i, j < n),使得 pipjp_i \oplus p_j 在所有这样的数对中最大,使用的查询次数最多为 3n3n。如果有多个数对满足条件,你可以输出其中任意一个。

输入
每个测试包含多个测试用例。第一行包含测试用例的数量 tt1t1031 \le t \le 10^3)。接下来是每个测试用例的描述。

交互
每个测试用例的第一行包含一个整数 nn2n1042 \le n \le 10^4)。此时,排列 p0,p1,,pn1p_0, p_1, \dots, p_{n-1} 已经确定。本题的交互器是非自适应的。也就是说,在每个测试用例中,序列 pp 是固定的,并且在交互过程中不会改变。

要进行查询,你需要选择四个下标 a,b,c,da, b, c, d0a,b,c,d<n0 \le a, b, c, d < n),并输出如下格式的一行:

? a b c d

之后,你会收到:

  • "<" 如果 (papb)<(pcpd)(p_a \mid p_b) < (p_c \mid p_d)
  • "=" 如果 (papb)=(pcpd)(p_a \mid p_b) = (p_c \mid p_d)
  • ">" 如果 (papb)>(pcpd)(p_a \mid p_b) > (p_c \mid p_d)

你最多可以进行 3n3n 次这种形式的查询。

接下来,如果你的程序找到了下标 iijj0i,j<n0 \le i, j < n)使得 pipjp_i \oplus p_j 最大,则输出如下格式的一行:

! i j

请注意,这一行不算作查询,也不计入查询次数的统计。

之后,继续处理下一个测试用例。

如果你在一次交互中进行的查询超过了 3n3n 次,你的程序必须立即终止,并且你会收到“Wrong Answer” verdict。否则,你可能会得到任意 verdict,因为你的程序会继续从关闭的流中读取。

在输出一个查询或一个测试用例的答案后,不要忘记输出换行并刷新输出缓冲区。否则,你会收到“Idleness Limit Exceeded” verdict。为此,请使用:

  • C++ 中的 fflush(stdout)cout.flush()
  • Java 中的 System.out.flush()
  • Pascal 中的 flush(output)
  • Python 中的 stdout.flush()
  • 其他语言请参阅相关文档。

保证所有测试用例的 nn 之和不超过 10410^4

注记
在第一个测试用例中,隐藏的排列是 p=[0,3,1,2]p = [0, 3, 1, 2]

  • 对于查询 ? 0 0 2 2,评测系统返回 "<",因为 $(p_0 \mid p_2) = (0 \mid 1) = 1 < (p_3 \mid p_1) = (2 \mid 3) = 3$。
  • 对于查询 ? 1 1 2 3,评测系统返回 "=",因为 $(p_1 \mid p_1) = (3 \mid 3) = 3 = (p_2 \mid p_3) = (1 \mid 2) = 3$。
  • 对于查询 ? 1 2 0 3,评测系统返回 ">",因为 $(p_1 \mid p_2) = (3 \mid 1) = 3 > (p_0 \mid p_3) = (0 \mid 2) = 2$。

答案 i=3i = 3j=2j = 2 是有效的:(p3p2)=(21)=3(p_3 \oplus p_2) = (2 \oplus 1) = 3 确实等于 pipjp_i \oplus p_j 可能的最大值。另一个有效答案是 i=0i = 0j=1j = 1。由于查询次数不超过 3n=123n = 12,因此答案被认为是正确的。

在第二个测试用例中,n=2n = 2,所以 pp 要么是 [0,1][0, 1],要么是 [1,0][1, 0]。无论如何,p0p1=1p_0 \oplus p_1 = 1 都是可能的最大值。