这是 FHQ 的 split 操作:
void update(int u)
{
tree[u].size=tree[tree[u].l].size+tree[tree[u].r].size+1;
}
void split(int u,int x,int &l,int &r)
{
if(!u)
{
l=r=0;
return ;
}
if(tree[u].val<=x)
{
l=u;
split(tree[u].r,x,tree[u].r,r);
}
if(tree[u].val>x)
{
r=u;
split(tree[u].l,x,l,tree[u].l);
}
update(u);
}
感觉 split 本质上没有修改 tree[] 本身啊,为什么最后还要 update 一下呢?