#include<stdio.h>
#include<string.h>
#define nmax 300000
#define cmax 100000
long n;
char s[cmax+10];
struct nod
{
long info;
nod *u[11];
};
nod *t[nmax];
void read()
{
scanf("%ld",&n);
}
void init(nod* &p)
{
int i;
for (i=0;i<=9;i++)
{
p->u[i]=NULL;
}
p->info=0;
}
void adtt(long n,long nc)
{
long i;
nod *p,*aux;
p=t[n];
p->info++;
for (i=0;i<nc;i++)
{
if (p->u[s[i]-'0']==NULL)
{
aux=new nod;
init(aux);
aux->info++;
p->u[s[i]-'0']=aux;
p=aux;
}
else
{
p=p->u[s[i]-'0'];
p->info++;
}
}
}
void update(long n,long st,long dr,long nc)
{
long m,fs,fd;
nod *aux;
if (st==dr)
{
adtt(n,nc);
return;
}
fs=(n<<1);
fd=fs+1;
if (t[fs]==NULL)
{
aux=new nod;
t[fs]=aux;
init(t[fs]);
}
if (t[fd]==NULL)
{
aux=new nod;
t[fd]=aux;
init(t[fd]);
}
m=(st+dr)/2;
if (nc<=m)
update(n<<1,st,m,nc);
else
update((n<<1)+1,m+1,dr,nc);
t[n]->info=t[n<<1]->info+t[(n<<1)+1]->info;
}
void search(long n,long k,long nc)
{
long i,j=-1;
nod *p;
p=t[n];
for (i=0;nc;i++)
{
if (p->u[i]!=NULL)
if ((p->u[i])->info>=k)
{
nc--;
s[++j]=i+'0';
p=p->u[i];
i=-1;
}
else k-=((p->u[i])->info);
}
printf("%s\n",s);
}
void query(long n,long st,long dr,long k)
{
long fs,fd,m;
if (st==dr && t[n]->info>=k)
{
search(n,k,st);
return;
}
fs=(n<<1);
fd=fs+1;
m=(st+dr)/2;
if (t[fs]->info>=k)
query(fs,st,m,k);
else
{
k-=t[fs]->info;
query(fd,m+1,dr,k);
}
}
int main()
{
freopen("nums.in","r",stdin);
freopen("nums.out","w",stdout);
read();
long i,nc,a,b,j;
nod *aux;
aux=new nod;
t[1]=aux;
init(t[1]);
for (i=1;i<=n;i++)
{
scanf("%ld ",&a);
scanf("%s",&s);
nc=strlen(s);
if (a==1)
{
update(1,1,cmax,nc);
}
else
{
b=0;
for (j=0;j<nc;j++)
{
b=b*10+s[j]-'0';
}
query(1,1,cmax,b);
}
}
return 0;
}