#include<bits/stdc++.h>
#include<cmath>
#define ld long double
#define ll long long
#define For(i,a,b) for(ll i=a;i<=b;i++)
#define Rof(i,a,b) for(ll i=a;i>=b;i--)
#define N 200010
#define pb push_back
#define mk make_pair
#define pque priority_queue
using namespace std;
int ls[N*50],rs[N*50],pri[N*50],sz[N*50],tag[N*50];
ll sum[N*50],val[N*50];
int rt[N];
int cnt=0,n,xx,yy,zz;
ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int add(int x){
sum[++cnt]=val[cnt]=x;
sz[cnt]=1;
pri[cnt]=rand();
return cnt;
}
int cop(int x){
int now=add(0);
ls[now]=ls[x];
rs[now]=rs[x];
pri[now]=pri[x];
sz[now]=sz[x];
val[now]=val[x];
sum[now]=sum[x];
return now;
}
void pushup(int x){
sz[x]=sz[ls[x]]+sz[rs[x]]+1;
sum[x]=sum[ls[x]]+sum[rs[x]]+val[x];
}
void pushdown(int x){
if(!tag[x]) return;
if(ls[x]) ls[x]=cop(ls[x]);
if(rs[x]) rs[x]=cop(rs[x]);
swap(ls[x],rs[x]);
if(ls[x]) tag[ls[x]]^=1;
if(rs[x]) tag[rs[x]]^=1;
tag[x]=0;
}
void split(int now,int k,int &x,int &y){
if(!now){
x=y=0;
return;
}
pushdown(now);
int u=sz[ls[now]]+1;
if(u<=k){
x=cop(now);
split(rs[x],k-u,rs[x],y);
pushup(x);
}else{
y=cop(now);
split(ls[y],k,x,ls[y]);
pushup(y);
}
}
int merge(int x,int y){
if(!x || !y) return x+y;
pushdown(x);
pushdown(y);
if(pri[x]<=pri[y]){
rs[x]=merge(rs[x],y);
pushup(x);
return x;
}else{
ls[y]=merge(x,ls[y]);
pushup(y);
return y;
}
}
int main()
{
srand(20090130);
n=read();
ll lstans=0;
For(i,1,n){
ll v=read(),op=read(),l,r;
rt[i]=rt[v];
if(op==1){
l=read()^lstans,r=read()^lstans;
split(rt[i],l,xx,yy);
rt[i]=merge(merge(xx,add(r)),yy);
}else if(op==2){
l=read()^lstans;
split(rt[i],l,xx,zz);
split(xx,l-1,xx,yy);
rt[i]=merge(xx,zz);
}else if(op==3){
l=read()^lstans,r=read()^lstans;
split(rt[i],r,xx,zz);
split(xx,l-1,xx,yy);
tag[yy]^=1;
rt[i]=merge(merge(xx,yy),zz);
}else{
l=read()^lstans,r=read()^lstans;
split(rt[i],r,xx,zz);
split(xx,l-1,xx,yy);
lstans=sum[yy];
cout<<sum[yy]<<endl;
rt[i]=merge(merge(xx,yy),zz);
}
}
return 0;
}