#include <stdio.h>
#include <string.h>
#define NMAX 100005
#define LMAX (1<<18)
#define HMAX 10
int t,A[LMAX],x,y,z;
char line[NMAX];
struct trie
{
int nr,pass;
trie *fiu[HMAX];
trie()
{
nr=0; pass=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *T[LMAX];
void init()
{
int i;
for (i=1; i<LMAX; i++)
T[i]=new trie;
}
inline int cif(char x)
{
return x>='0' & x<='9';
}
int find(trie *nod,char *s)
{
if (*s=='\n')
return nod->nr;
if (nod->fiu[*s-'0']==0)
return 0;
return find(nod->fiu[*s-'0'],s+1);
}
void ins(trie *nod,char *s)
{
nod->pass++;
if (*s=='\n')
{
nod->nr++;
return ;
}
if (nod->fiu[*s-'0']==0)
nod->fiu[*s-'0']=new trie;
ins(nod->fiu[*s-'0'],s+1);
}
void reconst(trie *nod,int val)
{
int i,val2=val;
for (i=0; i<=9; i++)
if (nod->fiu[i])
{
if ((nod->fiu[i])->pass<val2)
val2-=(nod->fiu[i])->pass;
else
{
printf("%d",i);
reconst(nod->fiu[i],val2);
return ;
}
}
}
void update(int st,int dr,int nod)
{
if (st==dr)
{
A[nod]++;
return ;
}
int mij=(st+dr)/2;
if (x<=mij)
update(st,mij,nod*2);
else
update(mij+1,dr,nod*2+1);
A[nod]=A[nod*2]+A[nod*2+1];
}
void cauta(int st,int dr,int nod)
{
if (st==dr)
{
z=st;
return ;
}
int mij=(st+dr)/2;
if (A[nod*2]<y)
{
y-=A[nod*2];
cauta(mij+1,dr,nod*2+1);
}
else
cauta(st,mij,nod*2);
}
int main()
{
freopen("nums.in","r",stdin);
freopen("nums.out","w",stdout);
init();
scanf("%d\n",&t);
int i,tip,poz;
for (i=1; i<=t; i++)
{
scanf("%d",&tip);
if (tip==1)
{
fgets(line+1,LMAX,stdin);
x=0; poz=1;
while (cif(line[poz+1])) poz++,x++;
if (!find(T[x],line+2))
{
update(1,LMAX-1,1);
ins(T[x],line+2);
}
}
if (tip==0)
{
scanf("%d",&y);
cauta(1,LMAX-1,1);
reconst(T[z],y);
printf("\n");
}
}
return 0;
}