```cpp
inline int upper(int &root,int val){//求val的前缀
int x,y,ans;
splitForVal(root,val-1,x,y);
ans=tr[atRank(x,tr[x].size)].val;
root=merge(x,y);
return ans;
}
inline int lower(int &root,int val){//求val的后缀
int x,y,ans;
splitForVal(root,val,x,y);
ans=tr[atRank(y,1)].val;
root=merge(x,y);
return ans;
}
inline LL query(int &root,int l,int r){//区间求和
int x,y,z,ans;
splitForRank(root,r,x,z);
splitForRank(x,l-1,x,y);
ans=tr[y].sum;
root=merge(merge(x,y),z);
return ans;
}
int main(void){
//srand(23333);//23333
srand((unsigned)time(NULL));//正经点为好2333
int m=read();
for(re int i=1;i<=m;++i){//唯一的循环,给你加个register好了2333
int v=read(),oper=read();
rt[i]=rt[v];
if(oper==1){
int p=read()^lastAns,val=read()^lastAns;
insertForRank(rt[i],p,val);
}
else if(oper==2){
int p=read()^lastAns;
delForRank(rt[i],p);
}
else if(oper==3){
int l=read()^lastAns,r=read()^lastAns;
if(l>r) swap(l,r);
rev(rt[i],l,r);
}
else if(oper==4){
int l=read()^lastAns,r=read()^lastAns;
if(l>r) swap(l,r);
lastAns=query(rt[i],l,r);
printf("%lld\n",lastAns);
}
}
return 0;
}
```
by Stay_Foolish @ 2019-03-30 01:29:16
太长了不让发。。
by Stay_Foolish @ 2019-03-30 01:29:38
不要在意蒟蒻的神奇注释(逃
by Stay_Foolish @ 2019-03-30 01:30:52
够仙
by 小粉兔 @ 2019-03-30 01:37:02
orz神仙
by SSerxhs @ 2019-03-30 01:39:47