经典FHQ,但全MLE。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+10;
int cnt=0,root[N],n,lastans=0;
struct node{
int ls,rs,pri,size,tag;
ll key,sum;
};
node t[N<<7];
int newnode(int x){
t[++cnt].size=1;
t[cnt].ls=0;
t[cnt].rs=0;
t[cnt].pri=rand();
t[cnt].key=x;
t[cnt].tag=0;
t[cnt].sum=x;
return cnt;
}
int treecopy(int p){
int rp=newnode(0);
t[rp]=t[p];
return rp;
}
void update(int p){
t[p].size=t[t[p].ls].size+t[t[p].rs].size+1;
t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum+t[p].key;
}
void pushdown(int p){
if(t[p].tag){
if(t[p].ls) t[p].ls=treecopy(t[p].ls);
if(t[p].rs) t[p].rs=treecopy(t[p].rs);
swap(t[p].ls,t[p].rs);
t[t[p].ls].tag^=1;
t[t[p].rs].tag^=1;
t[p].tag=0;
}
}
void split(int p,int x,int &L,int &R){
if(!p){
L=0;
R=0;
return;
}
pushdown(p);
if(t[t[p].ls].size+1<=x){
L=treecopy(p);
split(t[L].rs,x-t[t[p].ls].size-1,t[L].rs,R);
update(L);
}
else{
R=treecopy(p);
split(t[R].ls,x,L,t[R].ls);
update(R);
}
}
int Merge(int L,int R){
if( !L || !R ) return L+R;
pushdown(L);
pushdown(R);
if(t[L].pri>t[R].pri){
t[L].rs=Merge(t[L].rs,R);
update(L);
return L;
}
else{
t[R].ls=Merge(L,t[R].ls);
update(R);
return R;
}
}
int main(){
srand(time(NULL));
int L,R,p,v,op,vers=0;
ll x,y;
scanf("%d",&n);
while(n--){
scanf("%d%d",&v,&op);
if(op==1){
scanf("%lld%lld",&x,&y);
x^=lastans;
y^=lastans;
split(root[v],x,L,p);
root[++vers]=Merge(Merge(L,newnode(y)),p);
}
if(op==2){
scanf("%lld",&x);
x^=lastans;
split(root[v],x,L,R);
split(L,x-1,L,p);
root[++vers]=Merge(L,R);
}
if(op==3){
scanf("%lld%lld",&x,&y);
x^=lastans;
y^=lastans;
split(root[v],y,L,R);
split(L,x-1,L,R);
t[p].tag^=1;
root[++vers]=Merge(Merge(L,p),R);
}
if(op==4){
scanf("%lld%lld",&x,&y);
x^=lastans;
y^=lastans;
split(root[v],y,L,R);
split(L,x-1,L,R);
printf("%lld\n",t[p].sum);
lastans=t[p].sum;
root[++vers]=Merge(Merge(L,p),R);
}
}
return 0;
}