我们考虑如何求出构建 prufer 序列的过程中 x 被删除的时间,这样直接能知道 x 的父亲是谁,对 x, y 分别跑一遍可以知道答案(可以只跑一遍,但是正常人类的思维路径这里应该还想不到这一点)。
回顾线性求 prufer 序列的过程:维护指针 p 初始为 1,若 p 是叶子就删除,然后不断进行“如果父亲变成了叶子并且比 p 小就删除”,最后 p \gets p + 1。这个过程中,x 被删除时一定是一条链 y \rightsquigarrow x \rightsquigarrow z,从 y 到 z 依次被删除,且其中 y 是链上最大的点;这个链最后被删除,在此之前被删除的所有点都 < y。
离线整体二分,对于所有询问区间 [ql,qr] 与当前序列区间 [l,r] 有交的询问,判断区间中点是否合法,需要算右侧的一段前缀,先把未出现改写成总数减去出现,接下来略麻烦,如果 qr \le r 就用第一次出现的位置 \le qr 来刻画出现过;否则把 (r,qr] 部分出现过的先算上(在递归前几层必然算过),然后用 r 以后第一次出现位置 >qr 来刻画新的数的出现。对值域扫描线来刻画 [1,x),两种情况分别树状数组维护是简单的。