#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<deque>
#include<vector>
typedef long long ll;
const int N(2e5+5);
int root[N],n;
ll last_ans;
struct node{
bool lz;
int ls,rs,sz,vl,pri;
ll sum;
node(){}
node(int sz,int vl):lz(false),ls(0),rs(0),sz(sz),vl(vl),pri(rand()),sum(vl){}
};
std::deque<node> t;
std::vector<int> rb;
int new_node(int k){
int u;
if(rb.size()){
u=rb.back();rb.pop_back();
}else{
u=t.size();t.push_back(node());
}
t[u]=node(1,k);
return u;
}
int cpy(int u){
int v(new_node(0));
t[v]=t[u];
return v;
}
void push_u(int u){
t[u].sz=t[t[u].ls].sz+t[t[u].rs].sz+1;
t[u].sum=t[t[u].ls].sum+t[t[u].rs].sum+t[u].vl;
}
void tag(int &u){
if(u){
u=cpy(u);
t[u].lz^=true;
std::swap(t[u].ls,t[u].rs);
}
}
void push_d(int u){
if(t[u].lz){
tag(t[u].ls);
tag(t[u].rs);
t[u].lz=false;
}
}
void split(int u,int k,int &l,int &r){
if(u==0){
l=r=0;return;
}
push_d(u);
u=cpy(u);
if(k<t[t[u].ls].sz+1){
r=u;
split(t[u].ls,k,l,t[u].ls);
}else{
l=u;
split(t[u].rs,k-t[t[u].ls].sz-1,t[u].rs,r);
}
push_u(u);
}
void merge(int l,int r,int &u){
if(l==0||r==0){
u=l|r;return;
}
push_d(l);push_d(r);
if(t[l].pri>t[r].pri){
u=l;
merge(t[l].rs,r,t[l].rs);
}else{
u=r;
merge(l,t[r].ls,t[r].ls);
}
push_u(u);
}
void insert(int &u,int p,int k){
int l,r,v;
split(u,p,l,r);
v=new_node(k);
merge(l,v,l);merge(l,r,u);
}
void erase(int &u,int p){
int l,r,v;
split(u,p,l,r);
split(l,p-1,l,v);
rb.push_back(v);
merge(l,r,u);
}
void rever(int &u,int l,int r){
int v,w,x;
split(u,r,v,w);
split(v,l-1,v,x);
tag(x);
merge(v,x,v);merge(v,w,u);
}
ll query(int &u,int l,int r){
int v,w,x;
ll res;
split(u,r,v,w);
split(v,l-1,v,x);
res=t[x].sum;
merge(v,x,v);merge(v,w,u);
return res;
}
int main(){
int i,n,v,o,l,r;
t.push_back(node(0,0));
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d%d",&v,&o);
root[i]=root[v];
switch(o){
case 1:
scanf("%d%d",&l,&r);
l^=last_ans;r^=last_ans;
insert(root[i],l,r);
break;
case 2:
scanf("%d",&l);
l^=last_ans;
erase(root[i],l);
break;
case 3:
scanf("%d%d",&l,&r);
l^=last_ans;
rever(root[i],l,r);
break;
case 4:
scanf("%d%d",&l,&r);
l^=last_ans;r^=last_ans;
printf("%lld\n",last_ans=query(root[i],l,r));
}
}
return 0;
}