void spilt(int u,int x,int &L,int &R){
if(u==0){L=R=0;return;}
if(tree[tree[u].ls].size+1<=x){
down(u);L=u;spilt(tree[u].rs,x-1-tree[tree[u].ls].size,tree[u].rs,R);
}else{
down(u);R=u;spilt(tree[u].ls,x,L,tree[u].ls);
}
update(u);
}
spilt中down函数不能放在里面,应该放在外面
void spilt(int u,int x,int &L,int &R){
if(u==0){L=R=0;return;}
down(u);
if(tree[tree[u].ls].size+1<=x){
L=u;spilt(tree[u].rs,x-1-tree[tree[u].ls].size,tree[u].rs,R);
}else{
R=u;spilt(tree[u].ls,x,L,tree[u].ls);
}
update(u);
}
因为这里有区间翻转,左右节点可能互换