#include <bits/stdc++.h>
using namespace std;
int n;
int opt,x;
const int N=5e7+55;
struct node{
int l,r,size,val,key;
}tr[N];
int cnt,rt[N];
void newnode(int x){
tr[++cnt].val=x;
tr[cnt].key=rand();
tr[cnt].size=1;
}
void update(int p){
tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;
}
void split_val(int p,int val,int &x,int &y){
if(!p){
x=y=0;
return ;
}
if(tr[p].val<=val){
x=++cnt;
tr[x]=tr[p];
split_val(tr[x].r,val,tr[x].r,y);
}
else{
y=++cnt;
tr[y]=tr[p];
split_val(tr[y].l,val,x,tr[y].l);
}
update(p);
}
void split_size(int p,int size,int &x,int &y){
if(!p){
x=y=0;
return ;
}
if(size>tr[tr[p].l].size){
x=++cnt;
tr[x]=tr[p];
split_size(tr[x].r,size-tr[tr[x].l].size-1,tr[x].r,y);
}
else{
y=++cnt;
tr[y]=tr[p];
split_size(tr[y].l,size,x,tr[y].l);
}
update(p);
}
int merge(int x,int y){
if(x*y==0) return x+y;
if(tr[x].key<tr[y].key){
tr[x].r=merge(tr[x].r,y);
update(x);
return x;
}
else{
tr[y].l=merge(x,tr[y].l);
update(y);
return y;
}
}
void insert(int &root,int val){
int x,y,z;
x=y=z=0;
split_val(root,val-1,x,y);
newnode(val);
root=merge(merge(x,cnt),y);
}
void del(int &root,int val){
int x,y,z;
x=y=z=0;
split_val(root,val,x,y);
split_val(x,val-1,x,z);
root=merge(merge(x,merge(tr[z].l,tr[z].r)),y);
}
int query_rank(int &root,int val){
int x=0,y=0;
split_val(root,val-1,x,y);
int ans=tr[x].size+1;
root=merge(x,y);
return ans;
}
int query_num(int &root,int rk){
int x=0,y=0,z=0;
split_size(root,rk,x,y);
split_size(x,tr[x].size-1,x,z);
int ans=tr[z].val;
root=merge(merge(x,z),y);
return ans;
}
int query_pre(int &root,int val){
int x=0,y=0,z=0;
split_val(root,val-1,x,y);
split_size(x,tr[x].size-1,x,z);
int ans=tr[z].val;
root=merge(merge(x,z),y);
return ans;
}
int query_post(int &root,int val){
int x=0,y=0,z=0;
split_val(root,val,x,y);
split_size(y,1,y,z);
int ans=tr[y].val;
root=merge(x,merge(y,z));
return ans;
}
int main(){
cin>>n;
int ver,aimyon;
while(n--){
aimyon++;
scanf("%d%d%d",&ver,&opt,&x);
rt[aimyon]=rt[ver];
if(opt==1){
insert(rt[aimyon],x);
}
else if(opt==2){
del(rt[aimyon],x);
}
else if(opt==3){
printf("%d\n",query_rank(rt[aimyon],x));
}
else if(opt==4){
printf("%d\n",query_num(rt[aimyon],x));
}
else if(opt==5){
printf("%d\n",query_pre(rt[aimyon],x));
}
else if(opt==6){
printf("%d\n",query_post(rt[aimyon],x));
}
}
return 0;
}