#include <bits/stdc++.h>
using namespace std;
#define int long long
#define bint __int128
#define _3bkarm cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
struct waveletTree {
int lo, hi;
waveletTree *L, *R;
int *compare, *prefix, compareSize, prefixSize;
waveletTree() {
L = R = NULL;
lo = 1, hi = 0, compareSize = prefixSize = 0;
}
void init(int *from, int *to, int MIN, int MAX) {
lo = MIN, hi = MAX;
if (from >= to) return;
int mid = (lo + hi) >> 1;
auto f = [mid](int x) { return x <= mid; };
compare = new int[to - from + 2], compareSize = 0, compare[compareSize++] = 0;
prefix = new int[to - from + 2], prefixSize = 0, prefix[prefixSize++] = 0;
for (auto it = from; it != to; it++) {
compare[compareSize] = ( compare[compareSize - 1] + f(*it) ), ++compareSize;
prefix[prefixSize] = ( prefix[prefixSize - 1] + (*it) ), ++prefixSize;
}
if (hi == lo) return;
auto pivot = stable_partition(from, to, f);
L = new waveletTree(), L->init(from, pivot, lo, mid);
R = new waveletTree(), R->init(pivot, to, mid + 1, hi);
}
int kth(int l, int r, int k) {
if (l > r) return 0;
if (lo == hi) return lo;
int inLeft = compare[r] - compare[l - 1], lc = compare[l - 1], rc = compare[r];
if (k <= inLeft) return this->L->kth(lc + 1, rc, k);
return this->R->kth(l - lc, r - rc, k - inLeft);
}
~waveletTree() { delete L; delete R; }
};
struct suffixArray {
int n;
vector<int> kthSuffix, lcp, orderOf;
void build(string& s, int limit = 256) {
n = s.size() + 1; int k = 0, a, b;
vector<int> c( s.begin(), s.end() + 1 ), t(n), freq( max(n, limit) );
c.back() = 0, kthSuffix = lcp = orderOf = t, iota( kthSuffix.begin(), kthSuffix.end(), 0 );
for (int p = 0, j = 0; p < n; j = max(1LL, j * 2), limit = p) {
p = j;
iota( t.begin(), t.end(), n - j );
fill( freq.begin(), freq.end(), 0 );
for (int i = 0; i < n; ++i)
if (kthSuffix[i] >= j) t[p++] = kthSuffix[i] - j;
for (int i = 0; i < n; ++i) ++freq[ c[i] ];
for (int i = 1; i < limit; ++i) freq[i] += freq[i - 1];
for (int i = n; i--;) kthSuffix[ --freq[ c[ t[i] ] ] ] = t[i];
swap(c, t), p = 1, c[ kthSuffix[0] ] = 0;
for (int i = 1; i < n; ++i) {
a = kthSuffix[i - 1], b = kthSuffix[i];
c[b] = (t[a] == t[b] and t[a + j] == t[b + j]) ? (p - 1) : (p++);
}
}
for (int i = 1; i < n; ++i)
orderOf[ kthSuffix[i] ] = i;
for (int i = 0, j; i < n - 1; lcp[ orderOf[i++] ] = k)
for (k and k--, j = kthSuffix[ orderOf[i] - 1 ]; s[i + k] == s[j + k]; k++) {}
}
};
const int N = 200'000, LIMIT = 1000'000'000'000'000;
int g[N];
void getShitDone() {
int n;
cin >> n;
string s;
cin >> s;
reverse( s.begin(), s.end() );
suffixArray sf; sf.build(s);
vector<int> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
reverse( a.begin(), a.end() );
for (int i = n - 2; i >= 0; --i) a[i] += a[i + 1];
for (int i = 0; i < n; ++i) {
g[i] = -a[ sf.kthSuffix[i + 1] ];
}
waveletTree solve;
solve.init( g, g + n, -LIMIT, LIMIT );
vector<int> forward(n), back(n);
for (int i = 1; i <= n; ++i) {
if ( sf.lcp[i + 1] == n - sf.kthSuffix[i] ) {
forward[i - 1] = 1;
}
if ( sf.lcp[i] == n - sf.kthSuffix[i] ) {
back[i - 1] = 1;
}
}
vector<int> l(n);
for (int i = 0, last = 0; i < n; ++i) {
l[i] = last;
if (forward[i] == 0) last = i + 1;
}
vector<int> r(n);
for (int i = n - 1, last = n - 1; i >= 0; --i) {
r[i] = last;
if (back[i] == 0) last = i - 1;
}
int q;
cin >> q;
int ans = 0;
while (q--) {
int x, y;
cin >> x >> y;
int i = (x % n + ans % n + n) % n;
int k = (y % n + ans % n + n) % n + 1;
int p = sf.orderOf[n - 1 - i] - 1;
if (k > r[p] - l[p] + 1) {
ans = 0;
} else {
ans = -solve.kth(l[p] + 1, r[p] + 1, k);
}
cout << ans << '\n';
}
}
signed main() {
_3bkarm
int ts = 1;
// cin >> ts;
while (ts--) {
getShitDone();
if (ts != 0) cout << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgYmludCBfX2ludDEyOAojZGVmaW5lIF8zYmthcm0gY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7IGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKCnN0cnVjdCB3YXZlbGV0VHJlZSB7CiAgICBpbnQgbG8sIGhpOwogICAgd2F2ZWxldFRyZWUgKkwsICpSOwogICAgaW50ICpjb21wYXJlLCAqcHJlZml4LCBjb21wYXJlU2l6ZSwgcHJlZml4U2l6ZTsKCiAgICB3YXZlbGV0VHJlZSgpIHsKICAgICAgICBMID0gUiA9IE5VTEw7CiAgICAgICAgbG8gPSAxLCBoaSA9IDAsIGNvbXBhcmVTaXplID0gcHJlZml4U2l6ZSA9IDA7CiAgICB9CgogICAgdm9pZCBpbml0KGludCAqZnJvbSwgaW50ICp0bywgaW50IE1JTiwgaW50IE1BWCkgewogICAgICAgIGxvID0gTUlOLCBoaSA9IE1BWDsKICAgICAgICBpZiAoZnJvbSA+PSB0bykgcmV0dXJuOwogICAgICAgIGludCBtaWQgPSAobG8gKyBoaSkgPj4gMTsKICAgICAgICBhdXRvIGYgPSBbbWlkXShpbnQgeCkgeyByZXR1cm4geCA8PSBtaWQ7IH07CiAgICAgICAgY29tcGFyZSA9IG5ldyBpbnRbdG8gLSBmcm9tICsgMl0sIGNvbXBhcmVTaXplID0gMCwgY29tcGFyZVtjb21wYXJlU2l6ZSsrXSA9IDA7CiAgICAgICAgcHJlZml4ID0gbmV3IGludFt0byAtIGZyb20gKyAyXSwgcHJlZml4U2l6ZSA9IDAsIHByZWZpeFtwcmVmaXhTaXplKytdID0gMDsKICAgICAgICBmb3IgKGF1dG8gaXQgPSBmcm9tOyBpdCAhPSB0bzsgaXQrKykgewogICAgICAgICAgICBjb21wYXJlW2NvbXBhcmVTaXplXSA9ICggY29tcGFyZVtjb21wYXJlU2l6ZSAtIDFdICsgZigqaXQpICksICsrY29tcGFyZVNpemU7CiAgICAgICAgICAgIHByZWZpeFtwcmVmaXhTaXplXSA9ICggcHJlZml4W3ByZWZpeFNpemUgLSAxXSArICgqaXQpICksICsrcHJlZml4U2l6ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGhpID09IGxvKSByZXR1cm47CiAgICAgICAgYXV0byBwaXZvdCA9IHN0YWJsZV9wYXJ0aXRpb24oZnJvbSwgdG8sIGYpOwogICAgICAgIEwgPSBuZXcgd2F2ZWxldFRyZWUoKSwgTC0+aW5pdChmcm9tLCBwaXZvdCwgbG8sIG1pZCk7CiAgICAgICAgUiA9IG5ldyB3YXZlbGV0VHJlZSgpLCBSLT5pbml0KHBpdm90LCB0bywgbWlkICsgMSwgaGkpOwogICAgfQoKICAgIGludCBrdGgoaW50IGwsIGludCByLCBpbnQgaykgewogICAgICAgIGlmIChsID4gcikgcmV0dXJuIDA7CiAgICAgICAgaWYgKGxvID09IGhpKSByZXR1cm4gbG87CiAgICAgICAgaW50IGluTGVmdCA9IGNvbXBhcmVbcl0gLSBjb21wYXJlW2wgLSAxXSwgbGMgPSBjb21wYXJlW2wgLSAxXSwgcmMgPSBjb21wYXJlW3JdOwogICAgICAgIGlmIChrIDw9IGluTGVmdCkgcmV0dXJuIHRoaXMtPkwtPmt0aChsYyArIDEsIHJjLCBrKTsKICAgICAgICByZXR1cm4gdGhpcy0+Ui0+a3RoKGwgLSBsYywgciAtIHJjLCBrIC0gaW5MZWZ0KTsKICAgIH0KCiAgICB+d2F2ZWxldFRyZWUoKSB7IGRlbGV0ZSBMOyBkZWxldGUgUjsgfQp9OwoKc3RydWN0IHN1ZmZpeEFycmF5IHsKICAgIGludCBuOwogICAgdmVjdG9yPGludD4ga3RoU3VmZml4LCBsY3AsIG9yZGVyT2Y7CgogICAgdm9pZCBidWlsZChzdHJpbmcmIHMsIGludCBsaW1pdCA9IDI1NikgewogICAgICAgIG4gPSBzLnNpemUoKSArIDE7IGludCBrID0gMCwgYSwgYjsKICAgICAgICB2ZWN0b3I8aW50PiBjKCBzLmJlZ2luKCksIHMuZW5kKCkgKyAxICksIHQobiksIGZyZXEoIG1heChuLCBsaW1pdCkgKTsKICAgICAgICBjLmJhY2soKSA9IDAsIGt0aFN1ZmZpeCA9IGxjcCA9IG9yZGVyT2YgPSB0LCBpb3RhKCBrdGhTdWZmaXguYmVnaW4oKSwga3RoU3VmZml4LmVuZCgpLCAwICk7CgogICAgICAgIGZvciAoaW50IHAgPSAwLCBqID0gMDsgcCA8IG47IGogPSBtYXgoMUxMLCBqICogMiksIGxpbWl0ID0gcCkgewogICAgICAgICAgICBwID0gajsKICAgICAgICAgICAgaW90YSggdC5iZWdpbigpLCB0LmVuZCgpLCBuIC0gaiApOwogICAgICAgICAgICBmaWxsKCBmcmVxLmJlZ2luKCksIGZyZXEuZW5kKCksIDAgKTsKCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQogICAgICAgICAgICAgICAgaWYgKGt0aFN1ZmZpeFtpXSA+PSBqKSB0W3ArK10gPSBrdGhTdWZmaXhbaV0gLSBqOwoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpICsrZnJlcVsgY1tpXSBdOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxpbWl0OyArK2kpIGZyZXFbaV0gKz0gZnJlcVtpIC0gMV07CiAgICAgICAgICAgIGZvciAoaW50IGkgPSBuOyBpLS07KSBrdGhTdWZmaXhbIC0tZnJlcVsgY1sgdFtpXSBdIF0gXSA9IHRbaV07CgogICAgICAgICAgICBzd2FwKGMsIHQpLCBwID0gMSwgY1sga3RoU3VmZml4WzBdIF0gPSAwOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG47ICsraSkgewogICAgICAgICAgICAgICAgYSA9IGt0aFN1ZmZpeFtpIC0gMV0sIGIgPSBrdGhTdWZmaXhbaV07CiAgICAgICAgICAgICAgICBjW2JdID0gKHRbYV0gPT0gdFtiXSBhbmQgdFthICsgal0gPT0gdFtiICsgal0pID8gKHAgLSAxKSA6IChwKyspOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG47ICsraSkKICAgICAgICAgICAgb3JkZXJPZlsga3RoU3VmZml4W2ldIF0gPSBpOwoKICAgICAgICBmb3IgKGludCBpID0gMCwgajsgaSA8IG4gLSAxOyBsY3BbIG9yZGVyT2ZbaSsrXSBdID0gaykKICAgICAgICAgICAgZm9yIChrIGFuZCBrLS0sIGogPSBrdGhTdWZmaXhbIG9yZGVyT2ZbaV0gLSAxIF07IHNbaSArIGtdID09IHNbaiArIGtdOyBrKyspIHt9CiAgICB9Cn07Cgpjb25zdCBpbnQgTiA9IDIwMCcwMDAsIExJTUlUID0gMTAwMCcwMDAnMDAwJzAwMCcwMDA7CgppbnQgZ1tOXTsKCnZvaWQgZ2V0U2hpdERvbmUoKSB7CiAgICBpbnQgbjsKICAgIGNpbiA+PiBuOwoKICAgIHN0cmluZyBzOwogICAgY2luID4+IHM7CgogICAgcmV2ZXJzZSggcy5iZWdpbigpLCBzLmVuZCgpICk7CiAgICBzdWZmaXhBcnJheSBzZjsgc2YuYnVpbGQocyk7CgogICAgdmVjdG9yPGludD4gYShuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSBjaW4gPj4gYVtpXTsKICAgIHJldmVyc2UoIGEuYmVnaW4oKSwgYS5lbmQoKSApOwogICAgZm9yIChpbnQgaSA9IG4gLSAyOyBpID49IDA7IC0taSkgYVtpXSArPSBhW2kgKyAxXTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGdbaV0gPSAtYVsgc2Yua3RoU3VmZml4W2kgKyAxXSBdOwogICAgfQoKICAgIHdhdmVsZXRUcmVlIHNvbHZlOwogICAgc29sdmUuaW5pdCggZywgZyArIG4sIC1MSU1JVCwgTElNSVQgKTsKCiAgICB2ZWN0b3I8aW50PiBmb3J3YXJkKG4pLCBiYWNrKG4pOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgaWYgKCBzZi5sY3BbaSArIDFdID09IG4gLSBzZi5rdGhTdWZmaXhbaV0gKSB7CiAgICAgICAgICAgIGZvcndhcmRbaSAtIDFdID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCBzZi5sY3BbaV0gPT0gbiAtIHNmLmt0aFN1ZmZpeFtpXSApIHsKICAgICAgICAgICAgYmFja1tpIC0gMV0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICB2ZWN0b3I8aW50PiBsKG4pOwogICAgZm9yIChpbnQgaSA9IDAsIGxhc3QgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgbFtpXSA9IGxhc3Q7CiAgICAgICAgaWYgKGZvcndhcmRbaV0gPT0gMCkgbGFzdCA9IGkgKyAxOwogICAgfQogICAgdmVjdG9yPGludD4gcihuKTsKICAgIGZvciAoaW50IGkgPSBuIC0gMSwgbGFzdCA9IG4gLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIHJbaV0gPSBsYXN0OwogICAgICAgIGlmIChiYWNrW2ldID09IDApIGxhc3QgPSBpIC0gMTsKICAgIH0KCiAgICBpbnQgcTsKICAgIGNpbiA+PiBxOwoKICAgIGludCBhbnMgPSAwOwogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGludCB4LCB5OwogICAgICAgIGNpbiA+PiB4ID4+IHk7CgogICAgICAgIGludCBpID0gKHggJSBuICsgYW5zICUgbiArIG4pICUgbjsKICAgICAgICBpbnQgayA9ICh5ICUgbiArIGFucyAlIG4gKyBuKSAlIG4gKyAxOwogICAgICAgIGludCBwID0gc2Yub3JkZXJPZltuIC0gMSAtIGldIC0gMTsKCiAgICAgICAgaWYgKGsgPiByW3BdIC0gbFtwXSArIDEpIHsKICAgICAgICAgICAgYW5zID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhbnMgPSAtc29sdmUua3RoKGxbcF0gKyAxLCByW3BdICsgMSwgayk7CiAgICAgICAgfQoKICAgICAgICBjb3V0IDw8IGFucyA8PCAnXG4nOwogICAgfQp9CgpzaWduZWQgbWFpbigpIHsKICAgIF8zYmthcm0KCiAgICBpbnQgdHMgPSAxOwovLyAgICBjaW4gPj4gdHM7CiAgICB3aGlsZSAodHMtLSkgewogICAgICAgIGdldFNoaXREb25lKCk7CiAgICAgICAgaWYgKHRzICE9IDApIGNvdXQgPDwgJ1xuJzsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==