#include <iostream>
using namespace std;
#define maxn 100010
int N, maxdim;
char A[maxn], B[maxn];
//aloc static Trieul
int Trie[maxn*10][10], val[maxn], NrNod = 1;
int find(int nod, int poz) {
if(poz == maxdim) return 1;
int next = B[poz] - '0';
if(Trie[nod][next]) return find(Trie[nod][next], poz+1);
else return 0;
}
void insert(int nod, int poz) {
val[nod]++;
if(poz == maxdim) return;
int next = B[poz] - '0';
if(!Trie[nod][next]) {
NrNod++;
Trie[nod][next] = NrNod;
}
insert(Trie[nod][next], poz+1);
}
void query(int nod, int poz, int k) {
int nw = 0, lst = 0;
for(int i=0; i<=9; i++) {
if(Trie[nod][i]) {
lst = nw;
nw += val[ Trie[nod][i] ];
if(k <= nw) {
B[poz] = char('0' + i);
if(poz == maxdim-1) return;
else query(Trie[nod][i], poz+1, k-lst);
return;
}
}
}
}
int main() {
FILE *f1=fopen("nums.in", "r"), *f2=fopen("nums.out", "w");
int i, j, t, k, len, ok;
fscanf(f1, "%d\n", &N);
for(i=1; i<=N; i++) {
fscanf(f1, "%d ", &t);
fgets(A, sizeof(A), f1);
len = strlen(A) - 1;
if(t == 1) maxdim = max(maxdim, len);
}
fclose(f1);
FILE *f3=fopen("nums.in", "r");
fscanf(f3, "%d\n", &N);
for(i=1; i<=N; i++) {
fscanf(f3, "%d ", &t);
if(t == 1) {
fgets(A, sizeof(A), f3);
len = strlen(A) - 1;
for(j=0; j<maxdim - len; j++) {
B[j] = '0';
}
for(j=0; j<len; j++) {
B[maxdim - len + j] = A[j];
}
ok = find(1, 0);
if(!ok) insert(1, 0);
}
else {
fscanf(f1, "%d", &k);
query(1, 0, k);
j=0;
while(B[j] == '0') j++;
for(; j<maxdim; j++) {
fprintf(f2, "%c", B[j]);
}
fprintf(f2, "\n");
}
}
fclose(f3); fclose(f2);
return 0;
}