30pts,后7个点tle
#include <bits/stdc++.h>
using namespace std;
#define srand srand(time(NULL))
#define random(x) rand() % (x)
#define il inline
#define ptc putchar
#define reg register
#define mp make_pair
typedef __int128 LL;
typedef long long ll;
typedef pair<int, int> PII;
namespace cyyh {
template <typename T>
il void read(T &x) {
x = 0; T f = 1; char ch;
while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar(); x *= f;
}
template <typename T, typename ...L>
il void read(T &x, L &...y) {read(x); read(y...);}
template <typename T>
il void write(T x) {
if (x < 0) ptc('-'), x = -x;
if (x > 9) write(x / 10);
ptc(x % 10 + '0');
}
}
using namespace cyyh;
const int N = 205, M = 1e5 + 5;
int n, m, q, tot, qwq, root, tr1, tr2;
string name[N + M];
struct node {
int rnd, size, ls, rs;
node () {};
node (int _r) {rnd = _r, size = 1, ls = rs = 0;}
} tr[N + M];
int make(int x) {
return tr[++tot] = node(rand()), tot;
}
void pushup(int id) {
tr[id].size = tr[tr[id].ls].size + tr[tr[id].rs].size + 1;
}
void split(int &tr1, int &tr2, int id, int val) { // 分裂: < val >= val
// cout << id << endl;
if (!id) return tr1 = tr2 = 0, void();
if ((tr[tr[id].ls].size + 1) < val) {
tr1 = id;
split(tr[id].rs, tr2, tr[id].rs, val - tr[tr[id].ls].size - 1);
}
else {
tr2 = id;
split(tr1, tr[id].ls, tr[id].ls, val);
}
pushup(id);
}
int merge(int id1, int id2) {
if (!id1 || !id2) return id1 | id2;
if (tr[id1].rnd > tr[id1].rnd) {
tr[id1].rs = merge(tr[id1].rs, id2);
return pushup(id1), id1;
}
tr[id2].ls = merge(id1, tr[id2].ls);
return pushup(id2), id2;
}
void insert(int rnk, int x) {
split(tr1, tr2, root, rnk);
// cout << tr1 << "dDD" << endl;
root = merge(tr1, merge(make(x), tr2));
// cout << root << endl;
}
int kth(int k) {
int id = root;
while (1) {
// cout << "id " << id << ' ' << tr[id].size << endl;
if ((tr[tr[id].ls].size + 1) < k) k -= tr[tr[id].ls].size + 1, id = tr[id].rs;
else if ((tr[tr[id].ls].size + 1) > k) id = tr[id].ls;
else return id;
}
}
int main() {
srand;
cin >> n;
for (int i = 1; i <= n; ++i) {
string s;
cin >> s;
name[++qwq] = s;
insert(i, qwq);
}
cin >> m;
while (m--) {
string s; int x;
cin >> s >> x;
name[++qwq] = s;
insert(x + 1, qwq);
}
cin >> q;
while (q--) {
int k;
read(k);
cout << name[kth(k + 1)] << endl;
}
return 0;
}