WA 10pts,本地对拍无误,求 hack。
#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
inline int read() {
int x = 0; bool op = false;
char c = getchar();
while(!isdigit(c))op |= (c == '-'), c = getchar();
while(isdigit(c))x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return op ? -x : x;
}
const int N = 100210;
int n, m, rt, test, tot, seed = 1;
struct Node {
int ls, rs, key, sz;
string s;
}tr[N];
int rnd() {return seed *= 19260817;}
void add(string s) {
tr[++tot].ls = tr[tot].rs = 0;
tr[tot].sz = 1; tr[tot].key = rnd(); tr[tot].s = s;
return ;
}
void pushup(int k) {tr[k].sz = tr[tr[k].ls].sz + tr[tr[k].rs].sz + 1;}
void split(int k, int &a, int &b, int x) {
if(k == 0) {a = b = 0; return ;}
if(tr[tr[k].ls].sz + 1 <= x) {a = k; split(tr[k].rs, tr[k].rs, b, x - tr[tr[k].ls].sz - 1);}
else {b = k; split(tr[k].ls, a, tr[k].ls, x);}
pushup(k);
return ;
}
void merge(int &k, int a, int b) {
if(a == 0 || b == 0) {k = a + b; return ;}
if(tr[a].key < tr[b].key) {k = a; merge(tr[k].rs, tr[k].rs, b);}
else {k = b; merge(tr[k].ls, a, tr[k].ls);}
pushup(k);
return ;
}
int main() {
n = read();
for(int i = 1; i <= n; i++) {
string s; cin >> s;
add(s); merge(rt, rt, tot);
}
m = read();
for(int i = 1; i <= m; i++) {
string s; cin >> s; int x = read();
add(s);
int a = 0, b = 0;
split(rt, a, b, x); merge(a, a, tot); merge(rt, a, b);
}
int test = read();
while(test--) {
int x = read();
int a = 0, b = 0, c = 0;
split(rt, a, b, x);
split(b, c, b, 1);
cout << tr[c].s << endl;
merge(b, c, b);
merge(rt, a, b);
}
return 0;
}