分析:
直接模拟操作会mle,可以每次复制记录对应源字符串的下标,可以记录每次字符串增加的长度的左右端点下标,可以发现左端点与读入的l是对应的,因此就可以向前移到l的位置,这样层层递归,就能找到在原字符串的相对位置,能够向前移动的前提是查询的下标要在每次记录的区间以内。
代码:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while(T --) {
int n, c, q;
cin >> n >> c >> q;
string s;
cin >> s;
s = " " + s;
vector<ll> left(c + 1), right(c + 1), d(c + 1);
right[0] = n;
left[0] = 1;
for(int i = 1; i <= c; i ++) {
ll l, r;
cin >> l >> r;
left[i] = right[i - 1] + 1;
right[i] = left[i] + r - l;
d[i] = left[i] - l;
}
// for(int i = 1; i <= c; i ++) cout << left[i] << ' ' << right[i] << ' ' << d[i] << endl;
while(q --) {
ll x;
cin >> x;
for(int i = c; i >= 1; i --) {
if(left[i] <= x&&x <= right[i]) {
// cout << left[i] << ' ' << right[i] << endl;
// cout << d[i] << endl;
x -= d[i];
}
}
// cout << x << endl;
cout << s[x] << '\n';
}
}
}