#include #include #include #include using namespace std; #define MAX_N 10000 #define MAX_M 10000 const int ST_SIZE = (1 << 18) - 1; int N, M; char A[MAX_N]; int I[MAX_M], J[MAX_M], K[MAX_M]; char nums[MAX_N]; vector dat[ST_SIZE]; void init(int k, int l, int r) { if (r - l == 1) { dat[k].push_back(A[l]); } else { int lch = k * 2 + 1, rch = k * 2 + 2; init(lch, l, (l + r) / 2); init(rch, (l + r) / 2, r); dat[k].resize(r - l); merge(dat[lch].begin(), dat[lch].end(), dat[rch].begin(), dat[rch].end(), dat[k].begin()); } } int query(int i, int j, char x, int k, int l, int r) { // printf("query(%d, %d, %d, %d, %d, %d)\n", i, j, x, k, l, r); if (j <= l || r <= i) { return 0; } else if (i <= l && r <= j) { return upper_bound(dat[k].begin(), dat[k].end(), x) - dat[k].begin(); } else { int lc = query(i, j, x, k * 2 + 1, l, (l + r) / 2); int rc = query(i, j, x, k * 2 + 2, (l + r) / 2, r); return lc + rc; } } void solve() { for (int i=0; i < N; i++) nums[i] = A[i]; sort(nums, nums + N); init(0, 0, N); for (int i = 0; i < M; i++) { int l = I[i] - 1, r = J[i], k = K[i]; int lb = -1, ub = N - 1; while (ub - lb > 1) { int md = (ub + lb) / 2; int c = query(l, r, nums[md], 0, 0, N); if (c >= k) ub = md; else lb = md; } printf("%c\n", nums[ub]); } } int main() { cin >> N >> M; string str; cin >> str; for (int i = 0; i < N; i++) { A[i] = str[i]; } for (int i = 0; i < M; i++) { cin >> I[i] >> J[i] >> K[i]; } solve(); }