#include<bits/stdc++.h>
#define OK puts("OK");
using namespace std;
struct node{
int op,x;
bool operator <(const node o)const{
return x<o.x;
}
};
node opt[200001];
int n;
map<int,int>mp;
map<int,int>mp2;
priority_queue<int,vector<int>,greater<int> >qu;
bool mp3[1000001];
struct segment_tree{
int tree[1600001],lazy[1600001];
inline void down(int index,int mid,int left,int right){
lazy[index<<1]+=lazy[index];
lazy[(index<<1)+1]+=lazy[index];
tree[index<<1]+=lazy[index]*(mid-left+1);
tree[(index<<1)+1]+=lazy[index]*(right-mid);
lazy[index]=0;
}
void update(int gleft,int gright,int index,int x,int left,int right){
if(gleft<=left&&right<=gright){
tree[index]+=(x*(right-left+1));
lazy[index]+=x;
return;
}
if(right<gleft||gright<left){
return;
}
int mid=(left+right)>>1;
down(index,mid,left,right);
update(gleft,gright,index<<1,x,left,mid);
update(gleft,gright,(index<<1)+1,x,mid+1,right);
tree[index]=tree[index<<1]+tree[(index<<1)+1];
}
int search(int gleft,int gright,int index,int left,int right){
if(left>gright||right<gleft){
return 0;
}
if(left>=gleft&&right<=gright){
return tree[index];
}
else{
int mid=(left+right)>>1;
down(index,mid,left,right);
return search(gleft,gright,index<<1,left,mid)+search(gleft,gright,(index<<1)+1,mid+1,right);
}
}
};
segment_tree tr;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&opt[i].op,&opt[i].x);
if(opt[i].op==1||opt[i].op==3||opt[i].op==5||opt[i].op==6){
qu.push(opt[i].x);
}
}
int cnt=1,cnt2=1;
int pre;
while(!qu.empty()){
int x=qu.top();
qu.pop();
if(x>pre){
cnt2++;
}
mp[x]=cnt2;
mp2[cnt2]=x;
cnt++;
pre=x;
}
for(int i=1;i<=n;i++){
if(opt[i].op==1){
tr.update(mp[opt[i].x],mp[opt[i].x],1,1,1,n);
mp3[mp[opt[i].x]]=true;
}
if(opt[i].op==2){
tr.update(mp[opt[i].x],mp[opt[i].x],1,-1,1,n);
mp3[mp[opt[i].x]]=false;
}
if(opt[i].op==3){
printf("%d\n",tr.search(1,mp[opt[i].x]-1,1,1,n)+1);
}
if(opt[i].op==4){
int l=1,r=n;
while(l<=r){
int mid=(l+r)/2;
if(tr.search(1,mid-1,1,1,n)<opt[i].x){
l=mid+1;
}
else{
r=mid-1;
}
}
while(!mp3[l-1]){
l++;
}
printf("%d\n",mp2[l-1]);
}
if(opt[i].op==5){
int l=1,r=mp[opt[i].x]-1;
while(l<=r){
int mid=(l+r)/2;
if(tr.search(mid,opt[i].x-1,1,1,n)==0){
r=mid-1;
}
else{
l=mid+1;
}
}
while(!mp3[l-1]){
l--;
}
printf("%d\n",mp2[l-1]);
}
if(opt[i].op==6){
int l=mp[opt[i].x]+1,r=n;
while(l<=r){
int mid=(l+r)/2;
if(tr.search(mp[opt[i].x]+1,mid,1,1,n)==0){
l=mid+1;
}
else{
r=mid-1;
}
}
while(!mp3[r+1]){
r--;
}
printf("%d\n",mp2[r+1]);
}
}
return 0;
}