#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAX=1e9;
const int N=2e5+5;
struct node{int ls,rs,val,pri,siz,lazy;ll sum;}t[N<<7];
int cnt=0,root[N];
mt19937 rng(time(0));
int inline read(){
int 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 inline newnode(int x){
t[++cnt].siz=1,t[cnt].val=x,t[cnt].sum=x,t[cnt].pri=rng()%MAX+1;
return cnt;
}
int inline clone(int u){
int ret=newnode(0);
t[ret]=t[u];
return ret;
}
void inline update(int u){
t[u].siz=t[t[u].ls].siz+t[t[u].rs].siz+1;
t[u].sum=t[t[u].ls].sum+t[t[u].rs].sum+1;
}
void inline pushdown(int u){
if(t[u].lazy){
if(t[u].ls) t[u].ls=clone(t[u].ls); if(t[u].rs) t[u].rs=clone(t[u].rs);
swap(t[u].ls,t[u].rs); t[t[u].ls].lazy^=1,t[t[u].rs].lazy^=1;t[u].lazy=0;
}
}
void inline split(int u,int x,int &l,int &r){
if(u==0){l=r=0;return;}
pushdown(u);
if(t[t[u].ls].siz+1<=x){l=clone(u);split(t[l].rs,x-t[t[u].ls].siz-1,t[l].rs,r);update(l);}
else{r=clone(u);split(t[r].ls,x,l,t[r].ls);update(r);}
}
int inline merge(int l,int r){
if(l==0 or r==0) return l+r;
pushdown(l);pushdown(r);
if(t[l].pri>t[r].pri){t[l].rs=merge(t[l].rs,r);update(l);return l;}
else{t[r].ls=merge(t[r].ls,l);update(r);return r;}
}
int main(){
int rt_cnt=0,l,r,p,n=read();ll x,y,ans=0;
while(n--){
int v=read(),op=read();x=read(),x^=ans;
if(op==1){
y=read();y^=ans;
split(root[v],x,l,p);
root[++rt_cnt]=merge(merge(l,newnode(y)),p);
}
if(op==2){
split(root[v],x,l,r);split(l,x-1,l,p);
root[++rt_cnt]=merge(l,r);
}
if(op==3){
y=read();y^=ans;
split(root[v],y,l,r);split(l,x-1,l,p);
t[p].lazy^=1;
root[++rt_cnt]=merge(merge(l,p),r);
}
if(op==4){
y=read();y^=ans;
split(root[v],y,l,r);split(l,x-1,l,p);
ans=t[p].sum;
cout<<ans<<'\n';
root[++rt_cnt]=merge(merge(l,p),r);
}
}
return 0;
}