rt
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int x = 0, f = 1; char c = getchar();
while(c > '9' || c < '0') {if(c == '-') f = -1; c = getchar();}
while(c <= '9' && c >= '0') {x = x * 10 + c - '0'; c = getchar();}
return x * f;
}
const int maxn = 3e5 + 10;
int len;
struct Node
{
int size, rnd, val;
int ch[2];
}t[maxn<<4];
struct node
{
int l, r, k;
int id;
}q[50010];
bool cmp(node a, node b)
{
if((a.l / len) == (b.l / len)) return a.r < b.r;
return a.l < b.l;
}
void update(int id)
{
t[id].size = t[t[id].ch[0]].size + t[t[id].ch[1]].size + 1;
}
int tot, rt;
int newNode(int val)
{
t[++tot].size = 1;
t[tot].rnd = rand();
t[tot].val = val;
return tot;
}
void split(int id, int val, int &x, int &y)
{
if(!id) {x = y = 0; return;}
if(t[id].val < val)
{
x = id;
split(t[id].ch[1], val, t[id].ch[1], y);
}
else
{
y = id;
split(t[id].ch[0], val, x, t[id].ch[0]);
}
update(id);
}
int merge(int x, int y)
{
if(!x || !y) return x + y;
if(t[x].rnd < t[y].rnd)
{
t[x].ch[1] = merge(t[x].ch[1], y);
update(x); return x;
}
else
{
t[y].ch[0] = merge(x, t[y].ch[0]);
update(y); return y;
}
}
void ins(int val)
{
// printf("In insert\n");
int id = newNode(val);
int x, y;
split(rt, val, x, y);
rt = merge(merge(x, id), y);
}
int kth(int id, int k)
{
while(1)
{
int lsize = t[t[id].ch[0]].size;
if(k == lsize + 1) return t[id].val;
else if(k <= lsize) id = t[id].ch[0];
else k -= lsize+1, id = t[id].ch[1];
}
}
void del(int val)
{
int x, y, z;
// printf("In del\n");
split(rt, val, x, y);
split(y, val+1, y, z);
y = merge(t[y].ch[0], t[y].ch[1]);
rt = merge(merge(x, y), z);
}
//void inorder(int id)
//{
// if(!id) return;
// inorder(t[id].ch[0]);
// printf("%d ", t[id].val);
// inorder(t[id].ch[1]);
//}
int n, m;
int a[maxn], ans[maxn];
int main()
{
n = read(); m = read();
len = sqrt(n);
for(int i = 1; i <= n; i++) a[i] = read();
for(int i = 1; i <= m; i++) q[i].l = read(), q[i].r = read(), q[i].k = read(), q[i].id = i;
sort(q + 1, q + m + 1, cmp);
int l = 1, r = 0;
// inorder(rt);
// cout << endl;
for(int i = 1; i <= m; i++)
{
while(l > q[i].l) ins(a[--l]);
while(r < q[i].r) ins(a[++r]);
while(l < q[i].l) del(a[l++]);
while(r > q[i].r) del(a[r--]);
ans[q[i].id] = kth(rt, q[i].k);
}
for(int i = 1; i <= m; i++) cout << ans[i] << endl;
return 0;
}