# include <stdio.h>
# include <stdlib.h>
double alpha = 0.75;
typedef struct Tree{
int val;
int cnt;
int size;
int tag;
struct Tree* Left;
struct Tree* Right;
}Node;
Node* ini(int val)
{
Node* tmp;
tmp = (Node*) malloc (sizeof(Node));
tmp->Left = tmp->Right = NULL;
tmp->val = val;
tmp->size = tmp->cnt = 1;
tmp->tag = 1;
return tmp;
}
void update(Node* node)
{
node->size = node->cnt;
if (node->Left != NULL)
{
node->size += node->Left->size;
}
if (node->Right != NULL)
{
node->size += node->Right->size;
}
return ;
}
int arrindex;
int arr[100005];
void add_arr(Node* node)
{
if (node == NULL) return ;
add_arr(node->Left);
arr[arrindex++] = node->val;
add_arr(node->Right);
return ;
}
Node* build(int l,int r)
{
if (l > r)
{
return NULL;
}
int mid = l + (r - l) / 2;
Node* node = ini(arr[mid]);
node->Left = build(l,mid-1);
node->Right = build(mid+1,r);
update(node);
return node;
}
Node* rebuild(Node* node)
{
arrindex = 0;
add_arr(node);
node = build(0,arrindex-1);
return node;
}
Node* insert(Node* node,int val)
{
if (node == NULL)
{
node = ini(val);
return node;
}
if (val == node->val)
{
node->cnt++;
node->size++;
node->tag = 1;
return node;
}
else if (val > node->val)
{
node->Right = insert(node->Right,val);
}
else
{
node->Left = insert(node->Left,val);
}
update(node);
int threshold = alpha * node->size;
if ((node->Left != NULL && node->Left->size > threshold) || (node->Right != NULL && node->Right->size > threshold))
{
node = rebuild(node);
}
return node;
}
Node* del(Node* node,int val)
{
if (val == node->val)
{
node->cnt--;
node->size--;
if (!node->cnt)
{
node->tag = 0;
}
return node;
}
else if (val > node->val)
{
del(node->Right,val);
}
else
{
del(node->Left,val);
}
update(node);
int threshold = alpha * node->size;
if ((node->Left != NULL && node->Left->size > threshold) || (node->Right != NULL && node->Right->size > threshold))
{
node = rebuild(node);
}
return node;
}
int ans;
void rank(Node* node,int val)
{
if (val == node->val)
{
if (node->Left != NULL)
{
ans += node->Left->size;
}
}
else if (val > node->val)
{
if (node->Left != NULL)
{
ans += node->Left->size;
}
ans += node->cnt;
rank(node->Right,val);
}
else
{
rank(node->Left,val);
}
return ;
}
void kth(Node* node,int k)
{
int leftsize = 0;
if (node->Left != NULL)
{
leftsize = node->Left->size;
}
if (leftsize >= k)
{
kth(node->Left,k);
}
else if (node->cnt + leftsize >= k)
{
ans = node->val;
return ;
}
else
{
kth(node->Right,k-(node->cnt + leftsize));
}
return ;
}
void last(Node* root, int key) {
while (root)
{
if (root->val < key)
{
if (root->tag)
{
ans = root->val;
}
root = root->Right;
}
else
{
root = root->Left;
}
}
return ;
}
void next(Node* root, int key) {
while (root)
{
if (root->val > key)
{
if (root->tag)
{
ans = root->val;
}
root = root->Left;
}
else
{
root = root->Right;
}
}
return ;
}
int main (void)
{
Node* root = NULL;
int n;
scanf ("%d",&n);
for (int i=0;i<n;i++)
{
int op,x;
scanf ("%d %d",&op,&x);
if (op == 1)
{
root = insert(root,x);
}
else if (op == 2)
{
root = del(root,x);
}
else if (op == 3)
{
ans = 0;
rank(root,x);
printf ("%d\n",ans+1);
}
else if (op == 4)
{
ans = 0;
kth(root,x);
printf("%d\n",ans);
}
else if (op == 5)
{
ans = 0;
last(root,x);
printf ("%d\n",ans);
}
else if (op == 6)
{
ans = 0;
next(root,x);
printf ("%d\n",ans);
}
}
return 0;
}