#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct TreeNode{
int l,r,sum,m1,m2;
void clear(){
l=r=sum=0;
m1=-1e9,m2=1e9;
}
} tree[maxn*15];
stack<int> stk;
int tot=1,n;
void pushup(int p){
int ls=tree[p].l;
int rs=tree[p].r;
if(ls&&rs){
tree[p].sum=tree[ls].sum+tree[rs].sum;
tree[p].m1=tree[rs].m1;
tree[p].m2=tree[ls].m2;
}
else if(ls){
tree[p].sum=tree[ls].sum;
tree[p].m1=tree[ls].m1;
tree[p].m2=tree[ls].m2;
}else if(rs){
tree[p].sum=tree[rs].sum;
tree[p].m1=tree[rs].m1;
tree[p].m2=tree[rs].m2;
} else{
tree[p].sum=0;
tree[p].m1=-1e9;
tree[p].m2=1e9;
}
return;
}
int insert(int p,int l,int r,int x,int v){
if(p==0){
if(!stk.empty()){
p=stk.top();
stk.pop();
tree[p].clear();
} else{
p=++tot;
tree[p].clear();
}
}
if(l==r){
tree[p].sum+=v;
if(tree[p].sum==0){
stk.push(p);
p=0;
}else{
tree[p].m1=tree[p].m2=x;
}
return p;
}
int mid=(l+r)/2;
if(x<=mid)
tree[p].l=insert(tree[p].l,l,mid,x,v);
else
tree[p].r=insert(tree[p].r,mid+1,r,x,v);
pushup(p);
if(p!=1&&tree[p].sum==0){
stk.push(p);
p=0;
}
return p;
}
int Rank(int p,int l,int r,int x){
if(l>=x||p==0) return 0;
if(r<x) return tree[p].sum;
int mid=(l+r)/2;
int ls=tree[p].l,rs=tree[p].r;
return Rank(ls,l,mid,x)+Rank(rs,mid+1,r,x);
}
int query(int p,int l,int r,int x){
if(p==0||tree[p].sum<x) return -1;
if(l==r) return l;
int ls=tree[p].l,rs=tree[p].r;
int mid=(l+r)/2;
if(ls&&tree[ls].sum>=x)
return query(ls,l,mid,x);
return query(rs,mid+1,r,x-tree[ls].sum);
}
int main(){
tree[1].clear();
cin>>n;
for(int i=1;i<=n;i++){
int op;
cin>>op;
if(op==1){
int x;
cin>>x;
insert(1,-1e7,1e7,x,1);
}
else
if(op==2){
int x;
cin>>x;
insert(1,-1e7,1e7,x,-1);
}
else
if(op==3){
int x;
cin>>x;
cout<<Rank(1,-1e7,1e7,x)+1<<endl;
}
else
if(op==4){
int x;
cin>>x;
cout<<query(1,-1e7,1e7,x)<<endl;
}
else
if(op==5){
int x;
cin>>x;
cout<<query(1,-1e7,1e7,Rank(1,-1e7,1e7,x))<<endl;
}
else
{
int x;
cin>>x;
cout<<query(1,-1e7,1e7,Rank(1,-1e7,1e7,x+1)+1)<<endl;
}
}
return 0;
}