#include <bits/stdc++.h>
#define PII pair <int, int>
#define ll long long
#define MP make_pair
#define PB push_back
using namespace std;
constexpr int N = 2e5 + 10, INF = INT_MAX;
int n, a[N], cnt, root[N], m, b[N], rev[N];
char *p1, *p2, buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
inline int read ()
{
int x = 0, f = 1;
char ch = nc ();
while (ch < 48 || ch > 57)
{
if (ch == '-') f = -1;
ch = nc ();
}
while (48 <= ch && ch <= 57) x = x * 10 + ch - 48, ch = nc ();
return x * f;
}
struct tree
{
int val, ls, rs;
#define val(p) t[p].val
#define ls(p) t[p].ls
#define rs(p) t[p].rs
} t[N << 5];
int update (int p, int l, int r, int x)
{
int rt = ++cnt;
t[rt] = t[p], t[rt].val++;
if (l == r) return rt;
int mid = (l + r) >> 1;
if (x <= mid) ls (rt) = update (ls (p), l, mid, x);
else rs (rt) = update (rs (p), mid + 1, r, x);
return rt;
}
int query (int p, int q, int l, int r, int k)
{
if (l == r) return l;
int dta = val (ls (q)) - val (ls (p)), mid = (l + r) >> 1;
if (dta >= k) return query (ls (p), ls (q), l, mid, k);
else return query (rs (p), rs (q), mid + 1, r, k - dta);
}
signed main()
{
n = read (), m = read ();
for (int i = 1; i <= n; i++) a[i] = read (), b[i] = a[i];
sort (a + 1, a + n + 1);
int K = unique (a + 1, a + n + 1) - a - 1;
for (int i = 1; i <= K; i++) {int num = lower_bound (a + 1, a + K + 1, b[i]) - a; root[i] = update (root[i - 1], 0, N, num); rev[num] = b[i]; b[i] = num;}
for (int i = 1; i <= m; i++)
{
int l, r, k;
l = read (), r = read (), k = read ();
cout << rev[query (root[l - 1], root[r], 0, N, k)] << "\n";
}
return 0;
}