滴水不漏
题目背景
这是一道 IO 交互题。
题目描述
Gnar 购买了 $n$ 个水缸,其中第 $i$ 个水缸的容积为 $i$ 且因不明原因初始装有 $a_i$($0 \le a_i \le i$)单位的水。
好奇的 Gnar 想知道每个水缸装有的水量,但肉眼观察显然不可行,他希望你能帮他计算解决这个难题。
Gnar 唯一能替你执行的操作是,由你先指定 $i, j$($1 \le i, j \le n$),然后:
- 若 $i \neq j$,滴水不漏地将第 $i$ 个水缸的水往第 $j$ 个水缸倒,直到第 $i$ 个水缸的水被倒完或第 $j$ 个水缸已满。Gnar 会告诉你操作后第 $j$ 个水缸是否是满的。注意倒水的影响会**保留**而不是恢复到操作前。
- 若 $i = j$,Gnar 做不到让一个水缸的水往自己倒,他会直接告诉你当前第 $j$ 个水缸是否是满的。
Gnar 只肯接受**最多** $20000$ 次操作,否则他会认为你在调戏他!
你的任务是利用不超过 $20000$ 次操作 Gnar 告诉的结果,完整求出最初的 $a_1,a_2,\ldots,a_n$。
当然 Gnar 不会动手脚,你所求的 $a_1,a_2,\ldots,a_n$ 在操作前已经存在,不随操作动态生成。
输入输出格式
输入格式
输入单个正整数水缸个数 $n$ 以开始交互。
输出格式
在你确定答案后,用 `! a1 a2 ... an` 的形式输出一行以结束交互。
### 交互格式
交互过程中,用 `? i j` $(1 \le i,j \le n)$ 的形式输出一行以执行一次操作。然后你应输入一个布尔值,即操作的返回值 $x$。若 $x = 0$,表示第 $j$ 个水缸未满;若 $x = 1$,表示第 $j$ 个水缸已满。
上述的所有输入都应从**标准输入**中读入,所有输出都应向**标准输出**中输出。输出一行后必须**清空缓冲区**,否则你的评测将被判为 Time Limit Exceeded。清空缓冲区方式如下:
- 在 C++ 中,使用 `fflush(stdout)` 或 `cout.flush()`。
- 在 Pascal 中,使用 `flush(output)`。
- 在 Python 中,使用 `stdout.flush()`。
- 其他语言请自行查阅文档。
如果你的输出格式错误,或执行超过 $20000$ 次操作,你的评测将被判为 Wrong Answer。
输入输出样例
输入样例 #1
2
0
1
0
输出样例 #1
? 1 1
? 2 1
? 1 2
! 0 1
说明
**【样例解释 #1】**
样例示意了一种可能的交互过程。
初始两个水缸中分别装有 $0,1$ 单位的水。
第一次操作,由于 $i = j$,你直接得知 $x = 0$ 即第一个水缸未满。
第二次操作后两个水缸装有水量分别为 $1,0$,而你得知 $x=1$ 即第一个水缸当前已满。
第三次操作后两个水缸装有水量分别为 $0,1$,而你得知 $x=0$ 即第二个水缸当前未满。
注意过程中确切水量并不传达给你,但是通过返回值 $x$ 你足够唯一确定 $a_1 = 0$,$a_2 = 1$。
----
**【数据规模与约定】**
**本题采用捆绑测试**。你必须通过 Subtask 中所有的测试点才能获得该 Subtask 的分数。
- Subtask #1 (8 points):$n = 2$。
- Subtask #2 (17 points):$n \le 10$。
- Subtask #3 (15 points):$n \le 100$。
- Subtask #4 (15 points):$a_i \le 1$。
- Subtask #5 (25 points):$n \le 500$。
- Subtask #6 (20 points):无特殊限制。
对于所有的数据,保证 $2 \le n \le 1000$,$0 \le a_i \le i$。