//#include <bits/c++config.h>
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cmath>
#include <algorithm>
#include <climits>
#include <functional>
#include <cstring>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define itn int
#define nit int
#define ll long long //不开long long见祖宗!!!!!
#define ms multiset
#define F(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define UF(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define openf(a) freopen(#a".in","r",stdin);freopen(#a".out","w",stdout)
#define re register
#define ri re int
#define il inline
#define endl '\n'//血的教训!!!!!
//#pragma GCC optimize(3)
using namespace std;
using std::bitset;
using namespace __gnu_pbds;
inline int read() {
int x=0;
bool fu=0;
char ch=0;
while(ch>'9'||ch<'0') {
ch=getchar();
if(ch=='-')fu=1;
}
while(ch<='9'&&ch>='0') x=(x*10+ch-48),ch=getchar();
return fu?-x:x;
}
int root,now;
long long rd=233;
inline long long randint() {
rd*=2333;
rd+=23333;
rd%=1000000007;
return rd;
}
struct Treap {
int v,num,p,f,c[2],size;
} t[1000002];
inline void pushup(int pos) {
while(pos!=root) {
t[pos].size++;
pos=t[pos].f;
}
t[pos].size++;
}
inline void popup(int pos) {
while(pos!=root) {
t[pos].size--;
pos=t[pos].f;
}
t[pos].size--;
}
inline bool type(int pos) {
return t[t[pos].f].c[1]==pos;
}
inline void ro(int p) {
bool tp=type(p);
ri f=t[p].f,bro=t[t[p].f].c[!tp],gf=t[t[p].f].f;
int ch[2]= {t[p].c[0],t[p].c[1]};
if(f==root)root=p;
t[f].f=p;
t[p].f=gf;
t[p].c[!tp]=f;
t[f].c[tp]=ch[!tp];
t[ch[!tp]].f=f;
if(t[gf].c[0]==f)t[gf].c[0]=p;
else t[gf].c[1]=p;
t[p].size+=t[bro].size+t[f].num;
t[f].size-=t[ch[tp]].size+t[p].num;
}
inline void insert(int v) {
if(!root) {
root=++now;
t[now].v=v;
t[now].num=t[now].size=1;
t[now].p=randint();
} else {
ri pos=root;
while(1) {
if(v==t[pos].v) {
t[pos].num++;
pushup(pos);
return;
}
if(v<t[pos].v) {
if(t[pos].c[0]) {
pos=t[pos].c[0];
continue;
} else {
t[pos].c[0]=++now;
t[now].v=v;
t[now].f=pos;
t[now].num=1;
t[now].p=randint();
pushup(now);
while(t[now].p>t[t[now].f].p&&now!=root)ro(now);
return;
}
} else {
if(t[pos].c[1]) {
pos=t[pos].c[1];
continue;
} else {
t[pos].c[1]=++now;
t[now].v=v;
t[now].f=pos;
t[now].num=1;
t[now].p=randint();
pushup(now);
while(t[now].p>t[t[now].f].p&&now!=root)ro(now);
return;
}
}
}
}
}
inline int count(int v) {
ri pos=root;
while(1) {
if(v==t[pos].v) {
return t[pos].num;
}
if(v<t[pos].v) {
if(t[pos].c[0]) {
pos=t[pos].c[0];
continue;
} else {
return 0;
}
} else {
if(t[pos].c[1]) {
pos=t[pos].c[1];
continue;
} else {
return 0;
}
}
}
}
inline int last(int pos){
if(t[pos].c[0]){
pos=t[pos].c[0];
while(t[pos].c[1])pos=t[pos].c[1];
return pos;
}else{
while(type(pos)==0)pos=t[pos].f;
return t[pos].f;
}
}
inline int next(int pos){
if(t[pos].c[1]){
pos=t[pos].c[1];
while(t[pos].c[0])pos=t[pos].c[0];
return pos;
}else{
while(type(pos))pos=t[pos].f;
return t[pos].f;
}
}
inline int findpos(int v){
ri pos=root;
while(1) {
if(v==t[pos].v) {
return pos;
}
if(v<t[pos].v) {
if(t[pos].c[0]) {
pos=t[pos].c[0];
continue;
} else {
return last(pos);
}
} else {
if(t[pos].c[1]) {
pos=t[pos].c[1];
continue;
} else {
return pos;
}
}
}
}
inline int fbo(int k,int pos){
if(k>t[t[pos].c[0]].size&&k<=t[t[pos].c[0]].size+t[pos].num)return pos;
if(k<=t[t[pos].c[0]].size)return fbo(k,t[pos].c[0]);
else return fbo(k-t[t[pos].c[0]].size-t[pos].num,t[pos].c[1]);
}
inline int find_by_order(int k){
return fbo(k,root);
}
inline int order_of_key(int v){
ri pos=findpos(v),lst=t[pos].c[1],rt=0;
t[root].f=0;
rt=1-t[pos].num;
for(;pos;pos=t[pos].f){
if(t[pos].c[1]==lst){
rt+=t[pos].num+t[t[pos].c[0]].size;
}lst=pos;
}return rt;
}
inline void erase_pos(int pos){
if(t[pos].num>1){
t[pos].num--;
popup(pos);
return;
}
ri lc=t[pos].c[0],rc=t[pos].c[1];
if(lc==0&&rc==0){
popup(pos);
t[t[pos].f].c[type(pos)]=0;
t[pos].f=0;
return;
}if(lc==0){
ro(rc);
erase_pos(pos);
return;
}if(rc==0){
ro(lc);
erase_pos(pos);
return;
}else{
if(t[lc].p>t[rc].p){
ro(lc);
erase_pos(pos);
return;
}else{
ro(rc);
erase_pos(pos);
return;
}
}
}
inline void erase(int v){
ri pos=findpos(v);
if(t[pos].v!=v)return;
erase_pos(pos);
}
int n,opt,x,k;
int main() {
cin>>n;
F(i,1,n){
opt=read();
x=read();
if(opt==1){
insert(x);
}if(opt==2){
erase(x);
}if(opt==3){
cout<<order_of_key(x)<<endl;k++;
}if(opt==4){
cout<<t[find_by_order(x)].v<<endl;k++;
}if(opt==5){
int pos=findpos(x);
if(t[pos].v==x){
cout<<t[last(pos)].v<<endl;
}else cout<<t[pos].v<<endl;k++;
}if(opt==6){
cout<<t[next(findpos(x))].v<<endl;k++;
}
}
return 0;
}