#include<bits/stdc++.h>
#define INF 0x3f3f3f3f;
using namespace std;
inline int read() {
int x=0,f=0,ch=getchar();
while(!isdigit(ch)) f|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int m=2e7;
const int N=1e5+5;
int n;
int cnt;
int root;
struct node {
int ls,rs;
int l,r;
int siz;
}tr[N*30];
struct segment {
#define ls(u) tr[u].ls
#define rs(u) tr[u].rs
#define mid(u) (tr[u].l+tr[u].r>>1)
int New() {
++cnt;
tr[cnt].ls=tr[cnt].rs=tr[cnt].siz=0;
tr[cnt].l=tr[cnt].r=0;
return cnt;
}
void up(int u) {
tr[u].siz=tr[ls(u)].siz+tr[rs(u)].siz;
}
void insert(int u,int l,int r,int x) {
tr[u].l=l;
tr[u].r=r;
if(l==r) {
tr[u].siz++;
return ;
}
if(x<=mid(u)) {
if(!ls(u)) ls(u)=New();
insert(ls(u),l,mid(u),x);
}
else {
if(!rs(u)) rs(u)=New();
insert(rs(u),mid(u)+1,r,x);
}
up(u);
}
void del(int u,int x) {
if(tr[u].l==tr[u].r) {
tr[u].siz--;
return ;
}
if(x<=mid(u)) {
if(!ls(u)) return ;
del(ls(u),x);
}
else {
if(!rs(u)) return ;
del(rs(u),x);
}
up(u);
}
int rnk(int u,int l,int r) {
if(!u) return 0;
if(tr[u].l>r||tr[u].r<l) return 0;
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].siz;
return rnk(ls(u),l,r)+rnk(rs(u),l,r);
}
int num(int u,int x) {
if(tr[u].l==tr[u].r) return tr[u].l;
if(!ls(u)||tr[ls(u)].siz<x) return num(rs(u),x-tr[ls(u)].siz);
return num(ls(u),x);
}
int nxt(int u,int x) {
if(tr[u].r<=x) return INF;
if(tr[u].l==tr[u].r) return tr[u].l;
if(tr[u].l>x) {
if(tr[ls(u)].siz>0) return nxt(ls(u),x);
return nxt(rs(u),x);
}
return min(nxt(ls(u),x),nxt(rs(u),x));
}
}t;
int main() {
n=read();
root=t.New();
while(n--) {
int op,x;
op=read();
x=read();
if(op==1)
t.insert(root,-m,m,x);
else if(op==2)
t.del(root,x);
else if(op==3)
printf("%d\n",t.rnk(root,-m,x-1)+1);
else if(op==4)
printf("%d\n",t.num(root,x));
else if(op==5)
printf("%d\n",t.num(root,t.rnk(root,-m,x-1)));
else if(op==6)
printf("%d\n",t.nxt(root,x));
}
return 0;
}