const int M=1e6;
#define ls p<<1
#define rs p<<1|1
int a[M];
int b[M];
struct node{
int l,r;
int cnt;
}tr[M<<2];
void pull(int p){tr[p].cnt=tr[ls].cnt+tr[rs].cnt;}
void build(int p,int l,int r){
tr[p].l=l;tr[p].r=r;
if(l==r){tr[p].cnt=0;return;}
int mid=l+r>>1;
build(ls,l,mid);build(rs,mid+1,r);
pull(p);
}
void ins(int p,int x,int k){
if(tr[p].l==tr[p].r){tr[p].cnt+=k;return;}
int mid=tr[p].l+tr[p].r>>1;
if(x>mid)ins(rs,x,k);
else ins(ls,x,k);
pull(p);
}
int qr_range(int p,int l,int r){
if(l>r)return 0;
if(l<=tr[p].l&&tr[p].r<=r)return tr[p].cnt;
int mid=tr[p].l+tr[p].r>>1;
if(r<=mid)return qr_range(ls,l,r);
else if(l>mid)return qr_range(rs,l,r);
else if(l<=mid&&r>mid)return qr_range(ls,l,r)+qr_range(rs,l,r);
}
int qr(int x){
int p=lower_bound(b+1,b+1+cnt,x)-b;
if(p<=cnt&&b[p]==x)return p;
else return p-1;
}
int rk(int p,int q){
if(tr[p].l==tr[p].r){
return tr[p].l;
}
if(tr[ls].cnt>=q){
return rk(ls,q);
}
else{
return rk(rs,q-tr[ls].cnt);
}
}
void solve(){
cin>>n;
cnt=0;
vector<pii>qrr(n+1);
rep(i,1,n)cin>>qrr[i].fi>>qrr[i].se,a[i]=qrr[i].se;
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(i==1||a[i]!=a[i-1])b[++cnt]=a[i];
}
build(1,1,cnt);
rep(i,1,n){
auto[opt,x]=qrr[i];
if(opt==1)ins(1,qr(x),1);
else if(opt==2)ins(1,qr(x),-1);
else if(opt==3){
cout<<qr_range(1,1,qr(x-1))+1<<endl;
}else if(opt==4){
cout<<b[rk(1,x)]<<endl;
}else if(opt==5){
int rkx=qr_range(1,1,qr(x-1));
cout<<b[rk(1,rkx)]<<endl;
}else if(opt==6){
int rkx=qr_range(1,1,qr(x));
cout<<b[rk(1,rkx+1)]<<endl;
}
}
}