#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a, b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define DBG printf("this is a input\n")
#define fi first
#define se second
#define mk(a, b) make_pair(a,b)
#define p_queue priority_queue
ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) {
return a / gcd(a, b) * b;
}
int n;
struct pp{
int id, val;
}op[100005];
struct node
{
int l , r , v;
}tree[100005*5];
vector <int> v;
void build(int i , int l , int r)
{
tree[i].l = l , tree[i].r = r, tree[i].v = 0;
if(l == r)
return ;
int mid = (l + r) >> 1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
}
void InAndDel(int i , int k, int add)
{
if(tree[i].l == tree[i].r) {
tree[i].v += add;
return ;
}
if(k <= tree[i*2].r)
InAndDel(i*2,k,add);
if(k >= tree[i*2+1].l)
InAndDel(i*2+1,k,add);
tree[i].v = tree[i*2].v + tree[i*2+1].v;
}
int query(int i, int l , int r)
{
if(l > r)
return 0;
if(tree[i].l >= l && tree[i].r <= r)
return tree[i].v;
int sum = 0;
if(l <= tree[i*2].r)
sum += query(i*2,l,r);
if(r >= tree[i*2+1].l)
sum += query(i*2+1,l,r);
return sum;
}
int Kth(int i , int k)
{
if(tree[i].l == tree[i].r)
return tree[i].l;
if(tree[i*2].v >= k)
return Kth(i*2,k);
else
return Kth(i*2+1,k-tree[i*2].v);
}
int main(void)
{
scanf("%d",&n);
for(int i = 1 ; i <= n ; i ++) {
scanf("%d %d", &op[i].id, &op[i].val);
if(op[i].id != 4)
v.push_back(op[i].val);
}
sort(v.begin(),v.end()); //离散化
v.erase(unique(v.begin(),v.end()),v.end()); //去重
int len = v.size(); //统计全值域长度
build(1,1,len);
for(int i = 1 ; i <= n ; i ++)
{
if(op[i].id == 1){
int temp = lower_bound(v.begin(),v.end(),op[i].val)-v.begin()+1;
InAndDel(1,temp,1);
}
else if(op[i].id == 2){
int temp = lower_bound(v.begin(),v.end(),op[i].val)-v.begin()+1;
InAndDel(1,temp,-1);
}
else if(op[i].id == 3){
int temp = lower_bound(v.begin(),v.end(),op[i].val)-v.begin()+1;
printf("%d\n",query(1,1,temp-1)+1);
}
else if(op[i].id == 4) {
printf("%d\n", v[Kth(1, op[i].val) - 1]);
}
//前继
else if(op[i].id == 5){
int temp = lower_bound(v.begin(),v.end(),op[i].val)-v.begin()+1;
int pre = query(1,1,temp-1);
printf("%d\n",v[Kth(1,pre)-1]);
}
//后继
else
{
int temp = lower_bound(v.begin(),v.end(),op[i].val)-v.begin()+1;
int pre = query(1,1,temp);
printf("%d\n",v[Kth(1,pre+1)-1]);
}
}
}