对于一个已经确定的二叉搜索树,考虑怎样的点 $y$ 能成为一个加入的点 $x$ 的祖先。我们用 $(v,t)$ 表示一个点,其中 $v$ 为值,$t$ 为加入时间。
显然有 $ t_y < t_x $。此外,还需要所有值 $v_u \in (\min(v_x,v_y),\max(v_x,v_y))$ 的点 $u$,都满足 $t_y < t_u$,否则必有一个 $u$ 是 $x$ 的祖先且 $y$ 在另一子树内。
因此,对于所有加入的点,以 $v$ 为下标、以 $t$ 为值构建序列。则查询相当于从某个位置出发,往左右两侧分别进行:不断找第一个值小于当前自己的元素并跳转。即往左和往右的单调递减栈里面所有元素权值和,就是答案。注意如果查询的值已经在搜索树中出现,需要再加上其自己的值。
在上述过程中,我们允许发生在询问后的加点操作在询问前加入,因为我们只要把限制的初值设置成询问的时间即可,值大于询问时间的元素不会被考虑。所以离线操作和询问,从左往右扫每棵树 $i$,撤销 $r=i-1$ 的操作,加入 $l=i$ 的操作,然后询问即可。将所有涉及到的值 $v$ 离散化,使用两棵单侧递归线段树即可维护每个询问左右两边的贡献。
时间复杂度 $O(n+m\operatorname{log}^2m)$。