include [HTML_REMOVED]
define MAXn 100010
using namespace std;
int n, m;
int a[MAXn];
int ls[MAXn], ls_cnt;
map[HTML_REMOVED] LS;
struct Node
{
int l, r;
int cnt;
}tr[MAXn * 100];
int root[MAXn], idx;
int build(int l, int r)
{
int p = ++idx;
if(l == r) return p;
int mid = (l + r) >> 1;
tr[p].l = build(l, mid);
tr[p].r = build(mid + 1, r);
return p;
}
int insert(int q, int l, int r, int x)
{
int p = idx;
tr[p] = tr[q];
if(l == r)
{
tr[p].cnt;
return p;
}
int mid = (l + r) >> 1;
if(x <= mid)
tr[p].l = insert(tr[q].l, l, mid, x);
else tr[p].r = insert(tr[q].r, mid + 1, r, x);
tr[p].cnt = tr[tr[p].l].cnt + tr[tr[p].r].cnt;
return p;
}
int query(int p, int q, int l, int r, int k)
{
if(l == r)
return l;
int mid = (l + r) >> 1;
int lcnt = tr[tr[p].l].cnt - tr[tr[q].l].cnt;
if(lcnt >= k) return query(tr[p].l, tr[q].l, l, mid, k);
else return query(tr[p].r, tr[q].r, mid + 1, r, k - lcnt);
}
int main()
{
scanf(“%d%d”, &n, &m);
for(int i = 1; i <= n; i)
{
scanf(“%d”, &a[i]);
ls[i] = a[i];
}
sort(ls + 1, ls + n + 1);
ls_cnt = 1;
for(int i = 2; i <= n; i)
{
if(ls[i] != ls[ls_cnt])
{
ls[++ls_cnt] = ls[i];
}
}
//for(int i = 1; i <= ls_cnt; i++)
// printf("%d ", ls[i]);
for(int i = 1; i <= ls_cnt; i++)
{
LS[ls[i]] = i;
//printf("LS[%d] = %d\n", ls[i], i);
}
root[0] = build(1, ls_cnt);
for(int i = 1; i <= n; i++)
root[i] = insert(root[i - 1], 1, ls_cnt, LS[a[i]]);
while(m--)
{
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
printf("%d\n", ls[query(root[r], root[l - 1], 1, ls_cnt, k)]);
}
return 0;
}