询问的结果与数字大小有关,于是考虑三分状物,维护 d 可能的在的区间 [l,r](初始时 l=1,r=W),取三等分点 x=l+\lceil \frac{r-l+1}{3}\rceil,y=r-\lfloor\frac{r-l+1}{3}\rfloor ,我们希望用一次询问确定 d 在 [l,x),[x,y],(y,r] 中的哪一个,即确定 d 与 x,y 的大小关系。
考虑到如果只着眼于和 d 相关的大小比较肯定难以利用 = 进行三分,所以应该需要利用某些数的位置来间接得到 d 与 x,y 的大小关系。如果我们给交互库的序列包含 x,y,插入 d 之后,如果 x 的位置向右移动了,说明 d<x;否则如果 y 的位置向右移动了,d<y;如果都没有移动说明 d>y(这里没有管取不取等的问题,下面实现时注意自洽即可)。也就是说,我们只需要知道 x,y 的位置有没有移动。此时有一个很自然的构造:
取 z=x+y>r,z 的位置一定会向右移动,查询 z+1 这个位置一定是 z。考虑查询 x 和 y+1 两个位置上值的和与 z 的关系(即查询 S_1=\{x,y+1\},S_2=\{z+1\}):
如果 d\in[l,x),位置 x 上是 x-1,位置 y+1 上是 y,x+y-1<z,返回 <;
如果 d\in[x,y],位置 x 上是 x,位置 y+1 上是 y,x+y=z,返回 =;
如果 d\in(y,r],位置 x 上是 x,位置 y+1 上是 y+1,x+y+1>z,返回 >。
如此,我们便以一个十分简洁的构造完成了任务。
不过此时有一个问题:可能 z>W+200,这时把 z 加到初始序列中是不被交互库允许的。解决方案很简单,只要把 S_2=\{z\} 拆成若干个数 S_2=\{p,q,r\} 满足 p+q+r=z 即可。初始序列摆烂的话可以直接取 1\sim W 的所有数,我场上不太聪明写了个搜。