#include <fstream>
#include <iostream>
#include <cstdio>
#include <vector>
#include <string.h>
#include <algorithm>
#include <queue>
#define nMax 100001
#define mMax 100001
using namespace std;
ofstream fout("nums.out");
int n, nrEl, newNr, m;
string mat[nMax], newMat[nMax], sir;
int len[nMax], arb[4*nMax], poz[nMax];
bool cmp(const int &a, const int &b)
{
if(len[a]<len[b])
return 1;
if(len[a]>len[b])
return 0;
for(int i=0; i<len[a]; i++)
{
if(mat[a][i]<mat[b][i])
return 1;
if(mat[a][i]>mat[b][i])
return 0;
}
return 1;
}
bool verif(int mid)
{
if(len[mid]>m)
return 1;
if(len[mid]<m)
return 0;
for(int i=0; i<m; i++)
{
if(newMat[mid][i]>sir[i])
return 1;
if(newMat[mid][i]<sir[i])
return 0;
}
return 1;
}
void upDate(int node, int st, int dr, int poz)
{
if(st==dr)
{
arb[node]=1;
return;
}
int mid=st+(dr-st)/2;
if(poz<=mid)
upDate(2*node, st, mid, poz);
else
upDate(2*node+1, mid+1, dr, poz);
arb[node]=arb[2*node]+arb[2*node+1];
}
void query(int node, int st, int dr, int poz)
{
if(st==dr)
{
fout<<newMat[st]<<'\n';
return;
}
int mid=st+(dr-st)/2;
if(arb[2*node]>=poz)
query(2*node, st, mid, poz);
else
query(2*node+1, mid+1, dr, poz-arb[2*node]);
}
int main()
{
int op, k;
ifstream fin("nums.in");
fin>>n;
for(int i=1; i<=n; i++)
{
fin>>op;
if(op==0)
{
fin>>k;
continue;
}
fin>>mat[++nrEl];
for(int j=0; mat[nrEl][j]>='0' && mat[nrEl][j]<='9'; j++)
len[nrEl]++;
}
for(int i=1; i<=nrEl; i++)
poz[i]=i;
sort(poz+1, poz+nrEl+1, cmp);
for(int i=1; i<=nrEl; i++)
newMat[i]=mat[poz[i]];
for(int i=1; i<=nrEl; i++)
if(newMat[i]!=newMat[i-1])
newMat[++newNr]=newMat[i];
for(int i=1; i<=newNr; i++)
{
len[i]=0;
for(int j=0; newMat[i][j]>='0' && newMat[i][j]<='9'; j++)
len[i]++;
}
fin.close();
ifstream fin2("nums.in");
fin2>>n;
for(int i=1; i<=n; i++)
{
fin2>>op;
if(op==0)
{
fin2>>k;
query(1, 1, newNr, k);
continue;
}
fin2>>sir;
m=0;
for(int j=0; sir[j]>='0' && sir[j]<='9'; j++)
m++;
int st=1, dr=newNr, Sol=0;
while(st<=dr)
{
int mid=st+(dr-st)/2;
if(verif(mid))
{
Sol=mid;
dr=mid-1;
}
else
st=mid+1;
}
upDate(1, 1, newNr, Sol);
}
}