#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define debug puts("IAKIOI")
#define inf (int)1e18
using namespace std;
struct Treap{
int val,siz,ls,rs,key,rev,sum;
}t[10000010];
int tot,root[200010];
mt19937 rnd(998244353);
int new_node(int x)
{
t[++tot].val=x;
t[tot].siz=1;
t[tot].ls=t[tot].rs=0;
t[tot].key=rnd();
t[tot].sum=x;
return tot;
}
void pu(int x)
{
t[x].siz=1+t[t[x].ls].siz+t[t[x].rs].siz;
t[x].sum=t[t[x].ls].sum+t[t[x].rs].sum+t[x].val;
}
void pd(int x)
{
if(t[x].rev)
{
t[++tot]=t[t[x].ls];
t[x].ls=tot;
t[++tot]=t[t[x].rs];
t[x].rs=tot;
swap(t[x].ls,t[x].rs);
t[t[x].ls].rev^=1;
t[t[x].rs].rev^=1;
t[x].rev=0;
}
}
void split_k(int x,int rk,int &l,int &r)
{
if(!x)
{
l=r=0;
return;
}
int node=++tot;
t[node]=t[x];
pd(node);
if(t[t[x].ls].siz+1<=rk)
{
l=node;
split_k(t[node].rs,rk-t[t[x].ls].siz-1,t[node].rs,r);
}else{
r=node;
split_k(t[node].ls,rk,l,t[node].ls);
}
pu(node);
}
int merge(int l,int r)
{
if(!l||!r)
{
return l+r;
}
int node=++tot;
if(t[l].key<t[r].key)
{
t[node]=t[l];
pd(node);
t[node].rs=merge(t[node].rs,r);
}else{
t[node]=t[r];
pd(node);
t[node].ls=merge(l,t[node].ls);
}
pu(node);
return node;
}
signed main()
{
int q;
cin >> q;
int lstans=0;
for ( int i = 1 ; i <= q ; i++ )
{
int bb,op,l,r;
cin >> bb >> op;
root[i]=root[bb];
int L,R,M;
if(op==1)
{
cin >> l >> r;
l^=lstans;
r^=lstans;
if(t[root[i]].siz==0)
{
root[i]=new_node(r);
continue;
}
split_k(root[i],l,L,R);
root[i]=merge(merge(L,new_node(r)),R);
}else if(op==2)
{
cin >> l;
l^=lstans;
split_k(root[i],l,L,R);
split_k(L,t[L].siz-1,L,M);
root[i]=merge(L,R);
}else if(op==3)
{
cin >> l >> r;
l^=lstans;
r^=lstans;
split_k(root[i],r,L,R);
split_k(L,l-1,L,M);
t[M].rev=1;
root[i]=merge(merge(L,M),R);
}else {
cin >> l >> r;
l^=lstans;
r^=lstans;
split_k(root[i],r,L,R);
split_k(L,l-1,L,M);
cout << t[M].sum << endl;
lstans=t[M].sum;
root[i]=merge(merge(L,M),R);
}
}
return 0;
}