#include <stdio.h>
#include <string.h>
struct trie{
int numar;
trie *a[10];
};
int ai[400010];
trie *a[100010];
int i,n,l, Max_Lung,x,k;
char s[100100];
void init(trie *&a)
{
int i;
a=new trie;
a->numar = 0;
for (i=0; i<=9; i++)
a->a[i]=NULL;
}
int update_trie(trie *&a, int i)
{
if (i==l){
if (a==NULL){
init(a);
a->numar=1;
return 1;
}
else
return 0;
}
else {
if (a==NULL){
init(a);
int x=update_trie(a->a[s[i]-'0'],i+1);
a->numar=x;
return x;
}
else{
x=update_trie(a->a[s[i]-'0'],i+1);
a->numar+=x;
return x;
}
}
}
void update_ai(int nod,int st, int dr, int sum)
{
if (st==dr){
ai[nod]++;
return;
}
ai[nod]+=sum;
int mij=(st+dr)/2;
if (l<=mij)
update_ai(nod<<1,st,mij,sum);
else
update_ai((nod<<1)+1,mij+1,dr,sum);
}
int query_ai(int nod, int st, int dr, int &poz)
{
if (st==dr) return st;
int mij=(st+dr)/2;
if (ai[nod<<1]<poz){
poz-=ai[nod<<1];
return query_ai((nod<<1)+1,mij+1,dr,poz);
}
else
return query_ai(nod<<1,st,mij,poz);
}
void query_trie(trie *a)
{
if (a==NULL)
return;
int j;
for (j=0; j<=9; j++)
if (a->a[j]!=NULL){
if (a->a[j]->numar<k)
k-=a->a[j]->numar;
else{
printf("%d",j);
query_trie(a->a[j]);
break;
}
}
}
int main()
{
freopen("nums.in","r",stdin);
freopen("nums.out","w",stdout);
scanf("%d\n",&n); Max_Lung=100000;
for (i=1; i<=n; i++){
scanf("%d ",&x);
if (x==1){
fgets(s,100100,stdin);
l=strlen(s)-1;
update_ai(1,1,Max_Lung,update_trie(a[l],0));
}
else {
scanf("%d\n",&k);
l=query_ai(1,1,Max_Lung,k);
query_trie(a[l]);
printf("\n");
}
}
}