这是一个交互式问题。你必须在输出每行后立即执行清空缓冲区(flush)操作。例如,在 C++ 中你应该使用 fflush(stdout) 或 cout.flush(),在 Java 或 Kotlin 中使用 System.out.flush(),在 Python 中使用 sys.stdout.flush()。
对于一个长度为 $n$ 的 01 字符串 $s$(由字符 0 和/或 1 组成的字符串),我们将其代价(cost)定义为满足以下约束的整数 $x$ 的数量:
- 存在两个整数 $i, j$ 满足 $1 \le i, j \le n$,$i + j = x$ 且 $s_i \ne s_j$。
例如,字符串 11001 的代价为 $5$:满足条件的 $x$ 值为 $4, 5, 6, 8$ 和 $9$。
评测机拥有一个由 $n$ 个字符组成的 01 字符串 $b$。你会得到 $n$ 的值,但你不知道 $b$。你的目标是找到另一个长度相同且代价严格大于 $b$ 的字符串 $b'$,或者报告不存在这样的字符串。
在给出答案之前,你最多可以进行 $3$ 次如下形式的询问:
? l r— 询问评测程序 $b_l, b_{l+1}, \dots, b_r$ 中不同字符的数量。
给出答案不计入询问次数。
在每个测试点中,字符串 $b$ 是预先确定的。换句话说,交互器不是自适应的(non-adaptive)。
交互格式
起初,评测程序会输出一行,包含一个整数 $t$ ($1 \le t \le 500$) —— 测试组数。
处理每组测试数据时,评测程序首先会输出一行,包含一个整数 $n$ ($3 \le n \le 100$) —— $b$ 的长度。
要进行询问,你应该输出一行,格式如下:
? l r($1 \le l \le r \le n$)
作为响应,评测程序将输出一行,包含一个整数 —— $b_l, b_{l+1}, \dots, b_r$ 中不同字符的数量。如果你的询问不合法,或者你超过了允许的最大询问次数,该整数将为 $0$。在收到 $0$ 作为回答后,你的程序必须立即终止,否则你的提交结果可能是未定义的(undefined)。
要给出答案,你应该输出以下两种格式之一的一行:
NO(如果不存在与 $b$ 长度相同且代价严格更大的字符串 $b'$);YES b'(如果至少存在一个这样的字符串。你可以选择任何满足条件的字符串 $b'$)。
在你给出答案后,评测程序会输出一行,包含一个整数:
- $0$ 如果你的答案错误(在这种情况下,你的程序必须立即终止,否则你的提交结果可能是未定义的);
- $1$ 如果你的答案正确(在这种情况下,你可以继续处理下一组测试数据,如果这是最后一组测试数据,则终止程序)。
在输出任何内容后,请不要忘记清空输出缓冲区(flush)。否则,你可能会得到 "Idleness Limit Exceeded"(空闲超限)的结果。
样例
输入 1
3 // 测试组数 3 // n = 3 1 // b[1..3] 中有 1 种不同的字符 1 // 答案正确 3 // n = 3 2 // b[1..3] 中有 2 种不同的字符 1 // b[1..2] 中有 1 种不同的字符 1 // 答案正确 5 // n = 5 2 // b[1..5] 中有 2 种不同的字符 1 // b[1..4] 中有 1 种不同的字符 1 // 答案正确
输出 1
? 1 3 // 询问 b[1..3] YES 010 // 字符串 010 更好 ? 1 3 // 询问 b[1..3] ? 1 2 // 询问 b[1..2] NO // 没有更好的字符串 ? 1 5 // 询问 b[1..5] ? 1 4 // 询问 b[1..4] YES 11001 // 字符串 11001 更好
说明
样例展示了在 $t = 3$ 且各测试组中的字符串分别为 000、110 和 11110 时的一种可能交互过程。该测试点即为本题的第一个实际测试点。
请注意,// 符号后面的所有内容均为注释,用于解释交互中每一行的含义。在实际评测中,评测程序不会输出这些注释,你也不应该输出它们。空行同样是为了方便阅读而添加的,评测程序不会输出空行,你的程序也不应该输出任何空行。