#include <bits/stdc++.h>
using namespace std;
ifstream in("nums.in");
ofstream out("nums.out");
const int lim=1e5;
struct node
{
int dp,cif;
vector<int> vec;
}gol;
vector<node> v[lim+7];
int tree[4*lim+7];
void update(int nod,int l,int r,int poz)
{
if(l==r)
{
tree[nod]++;
return ;
}
int med=(l+r)/2;
if(poz<=med) update(2*nod,l,med,poz);
else update(2*nod+1,med+1,r,poz);
tree[nod]=tree[2*nod]+tree[2*nod+1];
}
int query(int nod,int l,int r,int &k)
{
if(l==r) return l;
int med=(l+r)/2;
if(tree[2*nod]>=k)
return query(2*nod,l,med,k);
k-=tree[2*nod];
return query(2*nod+1,med+1,r,k);
}
string s;
void add(int n,int c,int nod)
{
v[n][nod].dp++;
if(c==n) return ;
int nxt=0,ind;
for(int x:v[n][nod].vec)
if(v[n][x].cif==s[c]-'0')
{
nxt=x;
break;
}
if(nxt==0)
{
nxt=v[n].size();
v[n].push_back(gol);
v[n][nxt].cif=s[c]-'0';
v[n][nod].vec.push_back(nxt);
ind=v[n][nod].vec.size()-1;
while(ind and v[n][v[n][nod].vec[ind]].cif<v[n][v[n][nod].vec[ind-1]].cif)
swap(v[n][nod].vec[ind],v[n][nod].vec[ind-1]),--ind;
}
add(n,c+1,nxt);
}
void afis(int n,int c,int k,int nod)
{
if(c==n)
{
out<<'\n';
return ;
}
int nxt=0;
for(int x:v[n][nod].vec)
if(v[n][x].dp<k)
k-=v[n][x].dp;
else
{
nxt=x;
break;
}
out<<v[n][nxt].cif;
afis(n,c+1,k,nxt);
}
int main()
{
int tst,t,k,n;
in>>tst;
while(tst--)
{
in>>t;
if(t==1)
{
in>>s;
update(1,1,lim,s.size());
if(v[s.size()].empty())
v[s.size()].push_back(gol);
add(s.size(),0,0);
}
else
{
in>>k;
n=query(1,1,lim,k);
afis(n,0,k,0);
}
}
return 0;
}