A Certain Forbidden Index
题目背景
**这是一道函数式交互题。本题仅支持 C++ 提交。(出于某些原因,请不要使用 GCC 9 提交)**
**本地编译、提交时请在程序里加入以下函数声明语句:**
```cpp
int query(int, int);
```
**任何在赛时攻击交互库而得分的行为均视为作弊。**
题目描述
有一个长为 $n=2^k$ 的序列,基于这个序列建立了一棵[线段树](https://oi-wiki.org/ds/seg/)。现在线段树上有恰好一个节点被标记了。
你可以进行若干次询问,每次询问给定一个区间 $[l,r]$,交互库会在被修改的线段树上进行一次区间查询,你可以得知在被修改的线段树上这个区间对应的所有节点中,是否有节点被标记。
你需要在尽可能少的询问内找到这个节点。具体而言,若最优策略在最坏情况下需要 $Q$ 次询问,则你最多可以使用 $Q$ 次询问。
### 交互流程
你不需要,也不应该实现主函数,你只需要实现如下函数:
```cpp
std::pair<int, int> solve(int k);
```
该函数需要在得到答案后返回一个数对 $(x,y)$,表示被标记的线段树节点所对应的区间为 $[x,y]$。
你可以调用交互库提供的方法:
```cpp
int query(int l, int r);
```
传入的 `l` 和 `r` 代表询问的区间为 $[l,r]$。交互库会返回对应的结果。你需要保证 $1\le l\le r\le n$。具体而言:
- 当没有节点被标记时,交互库返回 $0$;
- 当有节点被标记时,交互库返回 $1$;
- 当询问的区间不合法时,交互库会返回 $-1$,此时你需要立即结束这组数据的交互(不是整个测试点),否则可能导致不可预知的错误。
本题无询问次数限制,但过多的询问会导致时间超限,详细信息请看“数据规模与约定”。
输入输出格式
输入格式
下面给出样例交互库的输入输出格式:
第一行输入一个整数 $T$,表示数据组数。
对于每组数据,第一行输入三个整数 $k,l,r$ 代表 $n=2^k$,且将对应区间为 $[l,r]$ 的线段树节点修改。
注意样例交互库不会检查输入数据的正确性。
输出格式
对于每组数据,如果你得到的答案正确,输出一个整数表示你使用的交互次数,否则:
- 若你的询问不合法,输出 `Wrong Answer [1]`;
- 若你返回的区间不正确,输出 `Wrong Answer [2]`。
输入输出样例
输入样例 #1
2
2 1 1
2 3 4
输出样例 #1
1
2
说明
#### 样例 1 解释
下面是一种可能的交互流程:
| 交互库 | 选手程序 | 备注 |
| :----------: | :----------: | :----------: |
| 调用 `solve(2)` | | 开始测试 |
| 返回 $1$ | 调用 `query(1,1)` | $[1,1]$ 就是答案节点 |
| | 返回 $(1,1)$ | 答案正确 |
| 调用 `solve(2)` | | 开始下一组数据的评测 |
| 返回 $1$ | 调用 `query(2,4)` | $[2,4]$ 对应的节点是 $[2,2]$ 和 $[3,4]$,包括了答案节点 |
| 返回 $0$ | 调用 `query(1,4)` | $[1,4]$ 对应的节点只有 $[1,4]$,不包括答案节点 |
| | 返回 $(3,4)$ | 答案正确,评测结束 |
### 计分方式
本题首先会受到和传统题相同的限制。例如编译错误会导致整道题目得 $0$ 分,运行时错误、超过时间限制、超过空间限制等会导致相应测试点得 $0$ 分等。
如果你找到的节点是错误的,或者你给出的询问不合法,在该测试点将会得到 $0$ 分。
否则,设在一组数据中,答案最坏需要 $x$ 次询问,而你使用了 $y$ 次询问,满分为 $t$,则这组数据的分数是 $t\times \min\left(1,\mathrm{e}^{-\frac{y}{x}+1}\right)$。
每个测试点取所有数据组中得分的最小值,向下保留两位小数。你的得分是所有测试点得分之和。
### 数据规模与约定
对于所有数据,保证 $1\le k\le 14$,$1\le T\le 300$。
本题共 $14$ 个测试点,对于第 $i$ 个测试点,保证 $k=i$。对于 $1\le k\le 4$ 的测试点,满分 $10$ 分。对于 $5\le k\le 14$ 的测试点,满分 $6$ 分。
保证在每组数据进行 $2n$ 次询问时,单个测试点内,交互库使用的时间不超过 0.6s,空间不超过 8MiB。
### 下发文件说明
下发文件中有一个可以通过样例的程序示例 `sample.cpp`,以及一个样例交互库 `grader.cpp`。假设你的答案文件为 `answer.cpp`,则可以使用如下命令将其编译成可执行文件 `answer`:
```shell
g++ grader.cpp answer.cpp -o answer -O2
```
实际评测时的交互库可能是自适应的,即被修改的节点可能不会在交互一开始时确定。