#include <bits/stdc++.h>
using namespace std;
const int SIZE = 200005;
int n, m, tot, q;
int root[SIZE], a[SIZE], b[SIZE];
int vis[SIZE], H[SIZE];
inline int rd(){
int f = 1, x = 0;
char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
x = x * 10 + (ch - '0');
ch = getchar();
}
return f * x;
}
struct TREE{
int l, r;
int val;
}t[SIZE*30];
int Build(int l, int r){
int p = ++tot;
if(l == r){
t[p].val = a[l];
return p;
}
int mid = (l + r) >> 1;
t[p].l = Build(l, mid);
t[p].r = Build(mid+1, r);
t[p].val = t[t[p].l].val + t[t[p].r].val;
return p;
}
int insert(int now, int l, int r, int x, int val){
int p = ++tot;
t[p] = t[now];
if(l == r){
t[p].val += val;
return p;
}
int mid = (l + r) >> 1;
if(x <= mid) t[p].l = insert(t[now].l, l, mid, x, val);
else t[p].r = insert(t[now].r, mid+1, r, x, val);
t[p].val = t[t[p].l].val + t[t[p].r].val;
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 cnt = t[t[p].l].val - t[t[q].l].val;
if(k <= cnt) return ask(t[p].l, t[q].l, l, mid, k);
else return ask(t[p].r, t[q].r, mid+1, r, k);
}
int main(){
n = rd(), q = rd();
for(int i = 1; i <= n; i++)
a[i] = rd(), b[i] = a[i];
sort(b+1, b+1+n);
m = unique(b+1, b+1+n) - b - 1;
root[0] = Build(1, m);
for(int i = 1; i <= n; i++){
a[i] = lower_bound(b+1, b+1+m, a[i]) - b;
root[i] = insert(root[i-1], 1, m, a[i], 1);
}
while(q--){
int l = rd(), r = rd(), k = rd();
int ans = ask(root[r], root[l-1], 1, m, k);
printf("%d\n", b[ans]);
}
return 0;
}