#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1 << 18;
ifstream in("nums.in");
ofstream out("nums.out");
struct trie
{
int nr;
trie *next[10];
trie()
{
nr = 0;
memset(next, 0, sizeof(next));
}
};
struct info
{
int nr;
trie *T;
info()
{
nr = 0;
T = new trie;
}
};
int n;
info a[maxn];
char buf[maxn];
int insert(trie *node, char *num, int ok)
{
if ( *num == '\0' )
{
node->nr = ok;
return ok;
}
int val = *num - '0';
if ( !node->next[val] )
{
node->next[val] = new trie;
ok = 1;
}
node->nr += insert(node->next[val], num + 1, ok);
}
void update(int nod, int st, int dr, int len)
{
if ( len < st || len > dr )
return;
if ( st == dr )
{
insert(a[nod].T, buf, 0);
a[nod].nr = a[nod].T->nr;
return;
}
int q = nod << 1;
int m = (st + dr) >> 1;
update(q, st, m, len);
update(q+1, m+1, dr, len);
a[nod].nr = a[q].nr + a[q+1].nr;
}
void print_kth(trie *node, int poz, int step, int len, char cif)
{
if ( cif != '-' )
out << cif;
if ( !node )
return;
int start = -1;
for ( int i = 0; i < 10; ++i )
if ( node->next[i] )
{
if ( node->next[i]->nr < poz )
poz -= node->next[i]->nr;
else
{
start = i;
break;
}
}
if ( start == -1 )
return;
print_kth(node->next[start], poz, step + 1, len, start + '0');
}
void query(int nod, int st, int dr, int poz)
{
if ( st == dr )
{
print_kth(a[nod].T, poz, 0, st, '-');
return;
}
int q = nod << 1;
int m = (st + dr) >> 1;
if ( a[q].nr < poz ) query(q+1, m+1, dr, poz - a[q].nr);
else query(q, st, m, poz);
}
int main()
{
in >> n;
int op, k, t;
int maxlen = -1;
for ( int i = 1; i <= n; ++i )
{
in >> op;
if ( op == 1 )
{
in >> buf;
int t = strlen(buf);
if ( t > maxlen )
maxlen = t;
update(1, 1, maxlen, t);
}
else
{
in >> k;
query(1, 1, maxlen, k);
out << '\n';
}
}
return 0;
}