RT
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=200005*50,M=200005;
int sz=0;
ll v[N];
int w[N],s[N],ch[N][2],fp[N];
ll sum[N];
int rt[M];
int clone(int u)
{
int t=++sz;
v[t]=v[u],w[t]=w[u],s[t]=s[u],sum[t]=sum[u];
ch[t][0]=ch[u][0],ch[t][1]=ch[u][1];
return t;
}
void down(int x)
{
if(x&&fp[x])
{
fp[x]=0;
swap(ch[x][0],ch[x][1]);
if(ch[x][0]) fp[ch[x][0]]^=1;
if(ch[x][1]) fp[ch[x][1]]^=1;
}
}
void up(int k)
{
s[k]=s[ch[k][0]]+s[ch[k][1]]+1;
sum[k]=sum[ch[k][0]]+sum[ch[k][1]]+v[k];
}
void split(int u,int k,int &x,int &y)
{
if(!u) x=y=0;
else
{
down(u);
if(k<=s[ch[u][0]])
{
y=clone(u);
split(ch[y][0],k,x,ch[y][0]);
up(y);
}
else
{
x=clone(u);
split(ch[x][1],k-s[ch[x][0]]-1,ch[x][1],y);
up(x);
}
}
}
int merge(int x,int y)
{
if(!x || !y) return x+y;
down(x);
down(y);
if(w[x]<w[y])
{
ch[x][1]=merge(ch[x][1],y);
up(x);
return x;
}
else
{
ch[y][0]=merge(x,ch[y][0]);
up(y);
return y;
}
}
int new_node(ll _v)
{
++sz;
sum[sz]=v[sz]=_v;
w[sz]=rand();
s[sz]=1;
ch[sz][0]=ch[sz][1]=0;
fp[sz]=0;
return sz;
}
void insert(int &rt,int u,int v)
{
int x,y;
split(rt,u,x,y);
rt=merge(merge(x,new_node(v)),y);
}
void del(int &rt,int k)
{
int x,y,z;
split(rt,k,x,z);
split(x,k-1,x,y);
y=merge(ch[y][0],ch[y][1]);
rt=merge(merge(x,y),z);
}
void flip(int &rt,int l,int r)
{
int a,b,c,d;
split(rt,r,a,b);
split(a,l-1,c,d);
fp[d]^=1;
rt=merge(merge(c,d),b);
}
ll q(int &rt,int l,int r)
{
int a,b,c,d;
split(rt,r,a,b);
split(a,l-1,c,d);
ll ret=sum[d];
rt=merge(merge(c,d),b);
return ret;
}
void dfs(int x)
{
if(!x) return;
down(x);
dfs(ch[x][0]);
printf("%d ",v[x]);
dfs(ch[x][1]);
}
int main()
{
int n;
ll v,op,p,l,r;
ll x;
srand(time(0));
scanf("%d",&n);
/* for(int i=1;i<=n;i++) insert(rt,i-1,i);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
flip(l,r);
}
dfs(rt);*/
ll A=0;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&v,&op);
rt[i]=rt[v];
switch(op)
{
case 1:{
scanf("%lld%lld",&p,&x);
p^=A,x^=A;
insert(rt[i],p,x);
break;
}
case 2:{
scanf("%lld",&p);
p^=A;
del(rt[i],p);
break;
}
case 3:{
scanf("%lld%lld",&l,&r);
l^=A,r^=A;
flip(rt[i],l,r);
break;
}
case 4:{
scanf("%lld%lld",&l,&r);
l^=A,r^=A;
printf("%lld\n",A=q(rt[i],l,r));
break;
}
}
}
return 0;
}