#include<iostream>
#include<cstdio>
#include<algorithm>
#include<ctime>
using std::cin;using std::cout;
constexpr int N=200005,M=40000005;
int n,v,opt,root[N],cnt,r1,r2,r3;
long long l,r,ans;
struct Treap{
struct A{int ls,rs,siz,val,rd;long long sum;bool tag;}a[M];
inline int newnode(int v){a[++cnt].sum=a[cnt].val=v;a[cnt].rd=rand();a[cnt].siz=1;return cnt;}
inline void pushup(int p){
a[p].siz=a[a[p].ls].siz+a[a[p].rs].siz+1;
a[p].sum=a[a[p].ls].sum+a[a[p].rs].sum+a[p].val;
}
inline void pushdown(int p){
A t;
if(a[p].ls){t=a[a[p].ls];a[p].ls=++cnt;a[cnt]=t;}
if(a[p].rs){t=a[a[p].rs];a[p].rs=++cnt;a[cnt]=t;}
if(a[p].tag) std::swap(a[p].ls,a[p].rs);
if(a[p].ls) a[a[p].ls].tag^=a[p].tag;
if(a[p].rs) a[a[p].rs].tag^=a[p].tag;
a[p].tag=0;
}
inline void split(int p,int k,int &x,int &y){
if(!p){x=y=0;return ;}
pushdown(p);
if(k<=a[a[p].ls].siz){y=++cnt;a[y]=a[p];split(a[y].ls,k,x,a[y].ls);pushup(y);}
else{x=++cnt;a[x]=a[p];split(a[x].rs,k-a[a[x].ls].siz-1,a[x].rs,y);pushup(x);}
}
inline int merge(int x,int y){
if(!x||!y) return x|y;
if(a[x].rd<a[y].rd){pushdown(x);a[x].rs=merge(a[x].rs,y);pushup(x);return x;}
pushdown(y);a[y].ls=merge(x,a[y].ls);pushup(y);return y;
}
}treap;
signed main(){
freopen("P5055_1.in","r",stdin);
freopen("P5055.out","w",stdout);
std::ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
cin>>n;srand(time(0));
for(int i=1;i<=n;++i){
cin>>v>>opt>>l;root[i]=root[v];l^=ans;
if(opt==1){
cin>>r;r^=ans;
treap.split(root[i],l,r1,r2);
root[i]=treap.merge(r1,treap.merge(treap.newnode(r),r2));
}
if(opt==2){
treap.split(root[i],l,r1,r3);
treap.split(r1,l-1,r1,r2);
root[i]=treap.merge(r1,r3);
}
if(opt==3){
cin>>r;r^=ans;
treap.split(root[i],r,r1,r3);
treap.split(r1,l-1,r1,r2);
treap.a[r2].tag^=1;
root[i]=treap.merge(r1,treap.merge(r2,r3));
}
if(opt==4){
cin>>r;r^=ans;
treap.split(root[i],r,r1,r3);
treap.split(r1,l-1,r1,r2);
cout<<(ans=treap.a[r2].sum)<<'\n';
root[i]=treap.merge(r1,treap.merge(r2,r3));
}
}
return 0;
}