#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 5;
int n, Q;
int a[N];
int st, s[N];
int cnt, root[N];
struct tree { int l, r, sum; }t[N];
#define lu t[u].l
#define lv t[v].l
#define ru t[u].r
#define rv t[v].r
#define sumu t[u].sum
#define sumv t[v].sum
#define mid (l + r >> 1)
void build(int u, int l, int r) {
if (l == r) return;
lu = ++cnt;
build(lu, 1, mid);
ru = ++cnt;
build(ru, mid + 1, r);
}
int insert(int u, int l, int r, int p) {
int v = ++cnt;
lv = lu, rv = ru, sumv = sumu + 1;
if (l == r)
return v;
if (p <= mid)
lv = insert(lu, 1, mid, p);
else
rv = insert(ru, mid + 1, r, p);
return v;
}
int ans(int u, int v, int l, int r, int k) {
if (l == r) return l;
int d = t[lv].sum - t[lu].sum;
if (d >= k)
return ans(lu, lv, 1, mid, k);
else
return ans(ru, rv, mid + 1, r, k - d);
}
signed main() {
cin >> n >> Q;
for (int i = 1; i <= n; ++i)
cin >> a[i];
copy(a + 1, a + n + 1, s + 1);
sort(s + 1, s + n + 1);
st = unique(s + 1, s + n + 1) - s - 1;
root[0] = ++cnt;
build(root[0], 1, st);
for (int i = 1; i <= n; ++i) {
int p = lower_bound(s + 1, s + st + 1, a[i]) - s;
root[i] = insert(root[i - 1], 1, st, p);
}
while (Q--) {
int l, r, k;
cin >> l >> r >> k;
cout << s[ans(root[l - 1], root[r], 1, st, k)] << '\n';
}
return 0;
}