#include<bits/stdc++.h>
#define ls tree[i].lss
#define rs tree[i].rss
using namespace std;
int rt[1000000];
struct ccc{
int lss,rss,siz;
}tree[(int)1e6*30];
int cnt=0;
int a[10000000],b[10000000];
int copy(int old){
tree[++cnt]=tree[old];
return cnt;
}
int build(int i,int l,int r){
i=++cnt;
if(l==r){
return i;
}
int mid=(l+r)>>1;
ls=build(ls,l,mid);
rs=build(rs,mid+1,r);
tree[i].siz=tree[ls].siz+tree[rs].siz;
return i;
}
int change(int i,int l,int r,int x,int k){
i=copy(i);
if(l==r){
tree[i].siz+=k;
return i;
}
int mid=(l+r)>>1;
if(x<=mid)ls=change(ls,l,mid,x,k);
else rs=change(rs,mid+1,r,x,k);
tree[i].siz=tree[ls].siz+tree[rs].siz;
return i;
}
int get(int be,int ed,int l,int r,int k){
if(l==r)return l;
int size=tree[tree[ed].lss].siz-tree[tree[be].lss].siz;
int mid=(l+r)>>1;
if(size>=k) return get(tree[be].lss,tree[ed].lss,l,mid,k);
else return get(tree[be].rss,tree[ed].rss,mid+1,r,k-size);
}
int rank(int be,int ed,int l,int r,int x){
if(l==r)return 1;
int size=tree[tree[ed].lss].siz-tree[tree[be].lss].siz;
int mid=(l+r)>>1;
if(x<=mid) return get(tree[be].lss,tree[ed].lss,l,mid,x);
else return get(tree[be].rss,tree[ed].rss,mid+1,r,x)+size;
}
int sum(int i,int l,int r,int x){
if(l==r)return tree[i].siz;
int mid=(l+r)>>1;
if(x<=mid)return sum(ls,l,mid,x);
else return sum(rs,mid+1,r,x);
}
int opt[1000000],v[10000000],x[10000000];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++){
cin>>v[i]>>opt[i]>>x[i];
b[i]=x[i];
}
sort(b+1,b+n+1);
int len=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++){
x[i]=lower_bound(b+1,b+len+1,x[i])-b;
}
rt[0]=build(0,1,n);
int cc=0;
for(int i=1;i<=n;i++){
// if(opt[i]==1)cc++;
if(opt[i]==1)rt[i]=change(rt[v[i]],1,n,x[i],1);
if(opt[i]==2){
if(sum(rt[v[i]],1,n,x[i]))rt[i]=change(rt[v[i]],1,n,x[i],-1);
else rt[i]=rt[v[i]];
}
if(opt[i]==3){
cout<<b[rank(rt[0],rt[v[i]],1,n,x[i])]<<"\n";
rt[i]=rt[v[i]];
}
if(opt[i]==4){
cout<<b[get(rt[0],rt[v[i]],1,n,x[i])]<<"\n";
rt[i]=rt[v[i]];
}
if(opt[i]==5){
if(x[i]==1)cout<<-INT_MAX<<"\n";
else cout<<b[get(rt[0],rt[v[i]],1,n,rank(rt[1],rt[v[i]],1,n,x[i])-1)]<<"\n";
}
if(opt[i]==6){
if(x[i]==len)cout<<INT_MAX<<"\n";
else cout<<b[get(rt[0],rt[v[i]],1,n,rank(rt[1],rt[v[i]],1,n,x[i])+sum(v[i],1,n,x[i]))]<<"\n";
}
}
return 0;
}