#include using namespace std; const int MX = 200000, ALPHA = 26; namespace suffix_array { const int LOG = 17; int group[LOG][MX], order[LOG][MX]; void build(char* s, int n) { static int cnt[MX]; memset(cnt, 0, 1024); for (int i = 0; i < n; i++) cnt[group[0][i] = s[i]]++; for (int i = 0, sum = 0; i < 256; i++) cnt[i] = (sum += cnt[i]) - cnt[i]; for (int i = 0; i < n; i++) order[0][cnt[(int)s[i]]++] = i; for (int i = 1, h = 1; i < LOG; i++, h *= 2) { int* grp = group[i - 1]; for (int j = n - 1; j >= 0; j--) cnt[grp[order[i - 1][j]]] = j; for (int j = 0; j < n; j++) { int p = order[i - 1][j] - h; if (p >= 0) order[i][cnt[grp[p]]++] = p; } for (int j = max(n - h, 0); j < n; j++) order[i][cnt[grp[j]]++] = j; for (int j = 1, g = 0; j < n; j++) { int curr = order[i][j], prev = order[i][j - 1]; int cnxt = curr + h, pnxt = prev + h; group[i][prev] = g; if (max(cnxt, pnxt) >= n || grp[curr] != grp[prev] || grp[cnxt] != grp[pnxt]) g++; group[i][curr] = g; } } } int lcp(int x, int y) { int res = 0; for (int i = LOG - 1; i >= 0; i--) if (group[i][x] == group[i][y]) { res += 1 << i; x += 1 << i; y += 1 << i; } return res; } } char s[MX + 1], ans[MX][ALPHA]; int main() { int q; ignore = scanf("%s %d", s, &q); int n = strlen(s); suffix_array::build(s, n); int* sorted = suffix_array::order[suffix_array::LOG - 1]; vector> vec = {{0, 0}}; vector> data; long long total = n * (n + 1ll) * (n + 2) / 6; for (int i = n - 1; i >= 0; i--) { int lcp = i == 0 ? 0 : suffix_array::lcp(sorted[i], sorted[i - 1]); int r = i; vec.emplace_back(n - sorted[i], i); while (vec.back().first > lcp) { int len; tie(len, r) = vec.back(); vec.pop_back(); int prevLen = max(vec.back().first, lcp); int cnt = r - i + 1; total -= (len * (len + 1ll) - prevLen * (prevLen + 1ll)) / 2 * cnt; data.emplace_back(total, prevLen, cnt, sorted[i]); } if (lcp > vec.back().first) vec.emplace_back(lcp, r); } reverse(data.begin(), data.end()); int g = 0; while (q--) { long long p, m; ignore = scanf("%lld %lld", &p, &m); long long k = p * g % m + 1, total; int prevLen, cnt, pos; tie(total, prevLen, cnt, pos) = *prev(lower_bound(data.begin(), data.end(), make_tuple(k, 0, 0, 0))); k -= total; long long F = 2 * prevLen + 1; long long D = F * F + (2 * k + cnt - 1) / cnt * 4; int curLen = max((int)((sqrt(D) - 1) / 2 - 2), prevLen + 1); k -= (curLen * (curLen - 1ll) - prevLen * (prevLen + 1ll)) / 2 * cnt; while (k > curLen * 1ll * cnt) { k -= curLen * 1ll * cnt; curLen++; } char ans = s[pos + (k - 1) % curLen]; printf("%c\n", ans); g += ans; } return 0; }