
1 #include <cstdio>
2 #include <algorithm>
3 using namespace std;
4 const int maxn = 100010;
5 struct Node {
6 int L, R, sum;
7 }T[maxn * 20];
8 int cnt;
9 void insert(int& num, int& val, int L, int R) {
10 T[cnt++] = T[val]; val = cnt - 1;
11 ++T[val].sum;
12 if (L == R) return;
13 int mid = (L + R) >> 1;
14 if (num <= mid) insert(num, T[val].L, L, mid);
15 else insert(num, T[val].R, mid + 1, R);
16 }
17 int query(int i, int j, int k, int L, int R) {
18 if (L == R) return L;
19 int t = T[T[j].L].sum - T[T[i].L].sum;
20 int mid = (R + L) >> 1;
21 if (k <= t) return query(T[i].L, T[j].L, k, L, mid);
22 else return query(T[i].R, T[j].R, k - t, mid + 1, R);
23 }
24 struct node {
25 int val, idx;
26 bool operator < (const node& rhs) const {
27 return val < rhs.val;
28 }
29 }a[maxn];
30 int rk[maxn], root[maxn];
31 int n, m;
32 int main() {
33 T[0].L = T[0].R = T[0].sum = 0;
34 root[0] = 0;
35 while (scanf("%d%d", &n, &m) != EOF) {
36 for (int i = 1; i <= n; ++i) {
37 scanf("%d", &a[i].val);
38 a[i].idx = i;
39 }
40 sort(a + 1, a + n + 1);
41 for (int i = 1; i <= n; ++i) rk[a[i].idx] = i;
42 cnt = 1;
43 for (int i = 1; i <= n; ++i) {
44 root[i] = root[i - 1];
45 insert(rk[i], root[i], 1, n);
46 }
47 while (m--) {
48 int i, j, k;
49 scanf("%d%d%d", &i, &j, &k);
50 printf("%d\n", a[query(root[i - 1], root[j], k, 1, n)].val);
51 }
52 }
53 }