#include<stdio.h>
#include<time.h>
#include<stdlib.h>
using namespace std;
struct treap
{
	int din,key,priority;
	treap *left,*right;
}*r,*nil;
int m,k;

treap* left(treap *t)
{
	treap *aux;
	aux=t->right;
	t->right=aux->left;
	aux->left=t;
	
	t->din=t->left->din+t->right->din+1;
	aux->din=aux->left->din+aux->right->din+1;
	return aux;
}

treap* right(treap *t)
{
	treap *aux;
	aux=t->left;
	t->left=aux->right;
	aux->right=t;

	t->din=t->left->din+t->right->din+1;
	aux->din=aux->left->din+aux->right->din+1;
	return aux;
}

treap* update(treap *t, int key)
{
	if(t==nil)
	{
		treap *aux=new treap;
		aux->left=aux->right=nil;
		aux->key=key;
		aux->priority=rand();
		aux->din=1;
		return aux;
	}
	if(key<=t->key)
	{
		t->left=update(t->left,key);
		if(t->left->priority>t->priority)
			t=right(t);
	}
	else
	{
		t->right=update(t->right,key);
		if(t->right->priority>t->priority)
			t=left(t);
	}
	t->din=t->left->din+t->right->din+1;
	return t;
}

void query(treap *t)
{
	if(k==t->left->din+1)
	{
		printf("%d\n",t->key);
		return;
	}
	if(k>t->left->din)
	{
		k=k-t->left->din-1;
		query(t->right);
	}
	else
		query(t->left);
}

treap* find(treap *t, int key)
{
	if(t->key==key)
		return t;
	if(key<t->key)
		return find(t->left,key);
	else
		return find(t->right,key);
}

void erase(treap *t)
{
	if(t->left==nil && t->right==nil)
	{
		
	}
	t->priority=-1;
	if(t->left->priority>t->left->priority)
	{
		t=right(t);
		erase(t);
	}
	else
	{
		t=left(t);
		erase(t);
	}
}

int main()
{
	nil=new treap;
	nil->priority=-1;
	nil->right=0;
	nil->left=0;
	nil->din=0;
	r=nil;
	srand(time(0));
	freopen("treapuri.in","r",stdin);
	freopen("treapuri.out","w",stdout);
	scanf("%d",&m);
	int i,tip,val;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&tip,&val);
		if(tip==1)
			r=update(r,val);
		if(tip==2)
		{
			k=val;
			query(r);
		}
		if(tip==3)
			erase(find(r,val));
	}
	return 0;
}

