#include <bits/stdc++.h>
#define _for(i, a, b) for (int i = (a); i <= (b); i ++ )
#define _all(i, a, b) for (int i = (a); i >= (b); i -- )
using namespace std;
const int N = 2e5 + 5;
int n, q, cnt;
int a[N], b[N], rt[N];
struct segTree { int l, r, sum; } tr[N << 4];
inline void modify(int u, int l, int r, int & id, int k)
{
id = ++ cnt, tr[id] = tr[k], tr[id].sum ++ ;
if (l == r) return ;
int mid = (l + r) >> 1;
if (u <= mid) modify(u, l, mid, tr[id].l, tr[k].l);
else modify(u, mid + 1, r, tr[id].r, tr[k].r);
}
inline int query(int l, int r, int rnk, int id, int k)
{
if (l == r) return l;
int mid = (l + r) >> 1;
int p = tr[tr[k].l].sum - tr[tr[id].l].sum;
if (rnk <= p) query(l, mid, rnk, tr[id].l, tr[k].l);
else query(mid + 1, r, rnk - p, tr[id].r, tr[k].r);
}
signed main()
{
ios :: sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> q;
_for (i, 1, n)
cin >> a[i], b[i] = a[i];
sort(b + 1, b + n + 1);
int m = unique(b + 1, b + n + 1) - b - 1;
_for (i, 1, n) a[i] = lower_bound(b + 1, b + m + 1, a[i]) - b;
_for (i, 1, n) modify(a[i], 1, m, rt[i], rt[i - 1]);
int l, r, x;
while (q -- )
{
cin >> l >> r >> x;
cout << b[query(1, m, x, rt[l - 1], rt[r])] << endl;
}
return 0;
}