#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define lfor(i, x, y) for (int i = x; i <= y; ++ i)
#define rfor(i, x, y) for (int i = x; i >= y; -- i)
using namespace std;
const int N = 2e5 + 10;
const int logN = 32;
struct SGT
{
struct Node
{
int l, r;
int dat;
#define dat(p) sgt[p].dat
#define l(p) sgt[p].l
#define r(p) sgt[p].r
}sgt[N * logN];
int P, root[N];
int build(int l, int r)
{
int p = ++ P; dat(p) = 0;
if (l == r) return p;
int mid = (l + r) >> 1;
l(p) = build(l, mid), r(p) = build(mid + 1, r);
}
int insert(int now, int l, int r, int pos, int val)
{
int p = ++ P;
sgt[p] = sgt[now];
if (l == r) {dat(p) += val; return p;}
int mid = (l + r) >> 1;
if (pos <= mid) l(p) = insert(l(now), l, mid, pos, val);
else r(p) = insert(r(now), mid + 1, r, pos, val);
dat(p) = dat(l(p)) + dat(r(p));
return p;
}
int ask(int p, int q, int l, int r, int k)
{
if (l == r) return l;
int mid = (l + r) >> 1;
int lcnt = dat(l(p)) - dat(l(q));
if (k <= lcnt) return ask(l(p), l(q), l, mid, k);
else return ask(r(p), r(q), mid + 1, r, k - lcnt);
}
}T;
int a[N], b[N];
int main()
{
int n, m; scanf("%d %d", &n, &m);
lfor (i, 1, n) scanf("%d", &a[i]), b[i] = a[i];
sort(b + 1, b + 1 + n);
int t = unique(b + 1, b + 1 + n) - (b + 1);
T.root[0] = T.build(1, t);
lfor (i, 1, n) T.root[i] = T.insert(T.root[i - 1], 1, t, lower_bound(b + 1, b + 1 + t, a[i]) - b, 1);
lfor (i, 1, m)
{
int l, r, k; scanf("%d %d %d", &l, &r, &k);
int ans = T.ask(T.root[r], T.root[l - 1], 1, t, k);
printf("%d\n", b[ans]);
}
return 0;
}