#include<bits/stdc++.h>
#define ll long long
#define reg register
#define db double
#define il inline
using namespace std;
void read(int &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
void read(ll &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
const int N=2e5+5;
int n,m;
struct node{
int lc,rc,val,siz,key,tag;ll summ;
}tree[N<<7];int rt[N],tot;
#define ls tree[x].lc
#define rs tree[x].rc
il void push_up(int x){
tree[x].summ=tree[ls].summ+tree[rs].summ+tree[x].val;
tree[x].siz=tree[ls].siz+tree[rs].siz+1;
}
void add(int x){
tree[++tot].val=x;tree[tot].siz=1;tree[tot].summ=x;
tree[tot].key=rand();
}
void push_down(int x){
int csl=++tot,csr=++tot;
tree[csl]=tree[rs];tree[csr]=tree[ls];
tree[csl].tag^=1;tree[csr].tag^=1;
tree[x].tag=0;tree[x].lc=csl;tree[x].rc=csr;
}
void split(int x,int k,int &l,int &r){
if(!x){
l=r=0;return;
}
if(tree[x].tag)push_down(x);
if(tree[ls].siz+1<=k){
l=++tot;tree[tot]=tree[x];split(tree[tot].rc,k-tree[ls].siz-1,tree[tot].rc,r);push_up(l);
}else{
r=++tot;tree[tot]=tree[x];split(tree[tot].lc,k,l,tree[tot].lc);push_up(r);
}
}
int merge(int x1,int x2){
if(!x1||!x2)return x1+x2;
if(tree[x1].tag)push_down(x1);
if(tree[x2].tag)push_down(x2);
if(tree[x1].key<tree[x2].key){
int tmp=x1;tree[tmp]=tree[x1];tree[tmp].rc=merge(tree[tmp].rc,x2);push_up(tmp);return tmp;
}else{
int tmp=x2;tree[tmp]=tree[x2];tree[tmp].lc=merge(x1,tree[tmp].lc);push_up(tmp);return tmp;
}
}
ll ans;
signed main(){
srand(20080927);
read(n);
for(int i=1;i<=n;i++){
int v,op,p,x;read(v);read(op);
if(op==1){
read(p);read(x);p^=ans;x^=ans;add(x);int tmp=tot;
int l,r;split(rt[v],p,l,r);
rt[i]=merge(merge(l,tmp),r);
}else if(op==2){
read(p);p^=ans;int ql,l,r;split(rt[v],p,l,r);split(l,p-1,l,ql);
rt[i]=merge(l,r);
}else if(op==3){
read(p);read(x);p^=ans;x^=ans;
int l,r,rr;split(rt[v],p-1,l,r);split(r,x-p+1,r,rr);
tree[r].tag^=1;rt[i]=merge(merge(l,r),rr);
}else{
read(p);read(x);p^=ans;x^=ans;
int l,r,rr;split(rt[v],p-1,l,r);
split(r,x-p+1,r,rr);
ans=tree[r].summ;printf("%lld\n",tree[r].summ);rt[i]=merge(merge(l,r),rr);
}
}
return 0;
}