void split(int pos,int x,int &posl,int &posr)
之前打成 int &pos ,在 erase 操作中会有影响。
但是样例第一次 insert 的时候,assert 却报错了。pos 不知为啥变成了 0。
split:
int node,L[N*100],R[N*100],root[N],rd[N*100],val[N*100],size[N*100];
void pushup(int pos) {size[pos]=size[L[pos]]+size[R[pos]]+1;}
void copy(int &pos)
{
L[++node]=L[pos], R[node]=R[pos];
rd[node]=rd[pos], val[node]=val[pos], size[node]=size[pos];
pos=node;
}
void split(int pos,int x,int &posl,int &posr)
{
if(!pos) {posl=posr=0; return;}
copy(pos);
if(val[pos]<=x) posl=pos, split(R[pos],x,R[posl],posr);
else posr=pos, split(L[pos],x,posl,L[posr]);
assert(pos!=0); pushup(pos);
}
insert:
mt19937 rnd(time(NULL));
rd[++node]=rnd(), val[node]=-inf, size[node]=1;
rd[++node]=rnd(), val[node]=inf, L[node]=1, pushup(2); root[0]=2;
n=read();
for(int i=1,v,type,x;i<=n;++i)
{
v=read(), type=read(), x=read(); root[i]=root[v];
// dfs(root[i]); puts("st");
if(type==1)
{
split(root[i],x,r1,r2);
rd[++node]=rnd(), val[node]=x, size[node]=1;
root[i]=merge(merge(r1,node),r2);
}
……
}