# include <cstdio>
# include <vector>
# include <algorithm>
# include <string.h>
# include <stdlib.h>
using namespace std;
# define FIN "nums.in"
# define FOUT "nums.out"
# define max(a, b) ((a) > (b) ? (a) : (b))
# define MAX_N 100005
int A[MAX_N << 1];
int p[MAX_N], c[MAX_N];
vector <int> nums[MAX_N];
char t[MAX_N], *s[MAX_N];
int N, i, op, cnt, l, bnd, dst, prev, k;
int cmp(int A, int B)
{
int vl = strcmp(s[A], s[B]);
if (!vl) return A < B;
else if (vl < 0) return 1;
return 0;
}
void update(int Nod, int St, int Dr, int Pz)
{
if (St == Dr) {A[Nod] = 1; return; }
int Mij = (St + Dr) >> 1;
if (Pz <= Mij) update(Nod << 1, St, Mij, Pz);
else update(Nod << 1 | 1, Mij + 1, Dr, Pz);
A[Nod] = A[Nod << 1] + A[Nod << 1 | 1];
}
int query(int Nod, int St, int Dr, int k)
{
if (St == Dr) return St;
int Mij = (St + Dr) >> 1;
if (k <= A[Nod << 1]) return query(Nod << 1, St, Mij, k);
else return query(Nod << 1 | 1, Mij + 1, Dr, k - A[Nod << 1]);
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d", &N);
for (i = 1; i <= N; ++i)
{
scanf("%d ", &op); gets(t);
if (op)
{
bnd = max(bnd, l = strlen(t));
s[++cnt] = (char*) malloc(l + 1);
strcpy(s[cnt], t);
nums[l].push_back(cnt);
}
}
for (i = 1; i <= bnd; ++i)
if (nums[i].begin() != nums[i].end())
{
sort(nums[i].begin(), nums[i].end(), cmp);
vector <int> :: iterator it;
p[prev = *nums[i].begin()] = ++dst;
c[dst] = prev;
for (it = nums[i].begin() + 1; it != nums[i].end(); ++it)
{
if (strcmp(s[prev], s[*it]) == 0) p[*it] = dst;
else p[*it] = ++dst;
c[dst] = *it;
prev = *it;
}
}
freopen(FIN, "r", stdin);
scanf("%d", &N);
for (i = 1, cnt = 0; i <= N; ++i)
{
scanf("%d ", &op);
if (op)
{
gets(t);
update(1, 1, dst, p[++cnt]);
} else
{
scanf("%d", &k);
printf("%s\n", s[c[query(1, 1, dst, k)]]);
}
}
return 0;
}