交上去报0
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n;
struct node{
int ls,rs,num,pri,siz;
long long sum;
bool tag;
}tr[maxn<<7];
int cnt_tr,root[maxn];
int New_node(int x){
tr[++cnt_tr].num=tr[cnt_tr].sum=x;
tr[cnt_tr].pri=rand(),tr[cnt_tr].siz=1;
return cnt_tr;
}int Clone(int id){
int ret=New_node(0);
tr[ret]=tr[id];
return ret;
}void Push_up(int id){
tr[id].siz=tr[tr[id].ls].siz+tr[tr[id].rs].siz+1;
tr[id].sum=tr[tr[id].ls].sum+tr[tr[id].rs].sum+tr[id].num;
}void Push_down(int id){
if(!tr[id].tag){
return;
}if(tr[id].ls){
tr[id].ls=Clone(tr[id].ls);
}if(tr[id].rs){
tr[id].rs=Clone(tr[id].rs);
}swap(tr[id].ls,tr[id].rs);
tr[tr[id].ls].tag=!tr[tr[id].ls].tag;
tr[tr[id].rs].tag=!tr[tr[id].rs].tag;
tr[id].tag=0;
}void Split(int id,int x,int &L,int &R){
if(!id){
L=R=0;
return;
}Push_down(id);
if(tr[tr[id].ls].siz+1<=x){
L=Clone(id);
Split(tr[L].rs,x-tr[tr[id].ls].siz-1,tr[L].rs,R);
Push_up(L);
}else{
R=Clone(id);
Split(tr[R].ls,x,L,tr[R].ls);
Push_up(R);
}
}int Merge(int L,int R){
if(!L||!R){
return L+R;
}Push_down(L),Push_down(R);
if(tr[L].pri>tr[R].pri){
tr[L].rs=Merge(tr[L].rs,R);
Push_up(L);
return L;
}tr[R].ls=Merge(L,tr[R].ls);
Push_up(R);
return R;
}signed main(){
srand(time(NULL));
scanf("%d",&n);
int now=0,L,p,R;
long long lastans=0;
for(int i=1;i<=n;i++){
int v,op;
scanf("%d%d",&v,&op);
if(op==1){
long long pos,x;
scanf("%lld%lld",&pos,&x);
pos^=lastans,x^=lastans;
Split(root[v],pos,L,p);
root[++now]=Merge(Merge(L,New_node(x)),p);
}else if(op==2){
long long pos;
scanf("%lld",&pos);
pos^=lastans;
Split(root[v],pos,L,R);
Split(L,pos-1,L,p);
root[++now]=Merge(L,R);
}else if(op==3){
long long l,r;
scanf("%lld%lld",&l,&r);
l^=lastans,r^=lastans;
Split(root[v],r,L,R);
Split(L,l-1,L,p);
tr[p].tag=!tr[p].tag;
root[++now]=Merge(Merge(L,p),R);
}else if(op==4){
long long l,r;
scanf("%lld%lld",&l,&r);
l^=lastans,r^=lastans;
Split(root[v],r,L,R);
Split(L,l-1,L,p);
lastans=tr[p].sum;
printf("%lld\n",lastans);
root[++now]=Merge(Merge(L,p),R);
}
}return 0;
}