萌新第一次写动态开点线段树,不知道这样写可不可以qwq
int root[N],rem[N];
struct sgt{
int sum,ls,rs;
}d[100*N];
int cntt=0;
void erase(int &x,int l,int r,int v){
if(x==0){
if(rem[0]){
x=rem[rem[0]];
rem[0]--;
}
else{
cntt++;
x=cntt;
}
}
if(l==r){
if(d[x].sum==1){
d[x].sum--;
}
if(d[x].sum==0){
rem[++rem[0]]=x;
x=0;
}
return ;
}
int mid=(l+r)/2;
if(v<=mid){
erase(d[x].ls,l,mid,v);
}
else{
erase(d[x].rs,mid+1,r,v);
}
d[x].sum=d[d[x].ls].sum+d[d[x].rs].sum;
if(d[x].sum==0){
rem[++rem[0]]=x;
x=0;
}
}
void insert(int x,int l,int r,int v){
if(x==0){
if(rem[0]){
x=rem[rem[0]];
rem[0]--;
}
else{
cntt++;
x=cntt;
}
}
if(l==r){
d[x].sum++;
return ;
}
int mid=(l+r)/2;
if(v<=mid){
insert(d[x].ls,l,mid,v);
}
else{
insert(d[x].rs,mid+1,r,v);
}
d[x].sum=d[d[x].ls].sum+d[d[x].rs].sum;
}