#include using namespace std; inline int read() { int x = 0, f = 1, c = getchar(); while (c < 48) c == '-' && (f = -1), c = getchar(); while (c > 47) x = x * 10 + c - '0', c = getchar(); return x * f; } const int MAXN = 200005; int ls[MAXN * 32], rs[MAXN * 32], sum[MAXN * 32]; int rt[MAXN], val[MAXN], raw[MAXN]; int n, m, q, tot; void insert(int &x, int y, int l, int r, int k) { ls[x = ++tot] = ls[y]; rs[x] = rs[y]; sum[x] = sum[y] + 1; if (l == r) return; int mid = (l + r) >> 1; if (k <= mid) insert(ls[x], ls[y], l, mid, k); if (k > mid) insert(rs[x], rs[y], mid + 1, r, k); } int query(int x, int y, int l, int r, int k) { if (l == r) return l; int mid = (l + r) >> 1, s = sum[ls[y]] - sum[ls[x]]; if (k <= s) return query(ls[x], ls[y], l, mid, k); return query(rs[x], rs[y], mid + 1, r, k - s); } int main(int argc, char const *argv[]) { n = read(); q = read(); for (int i = 1; i <= n; ++i) val[i] = raw[i] = read(); sort(val + 1, val + n + 1); m = unique(val + 1, val + n + 1) - val - 1; for (int i = 1, k; i <= n; ++i) { k = lower_bound(val + 1, val + m + 1, raw[i]) - val; insert(rt[i], rt[i - 1], 1, m, k); } for (int i = 1, l, r, k, x; i <= q; ++i) { l = read(); r = read(); k = read(); x = query(rt[l - 1], rt[r], 1, m, k); printf("%d\n", val[x]); } return 0; }