#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N(200010);
ll n,m;
struct edge{
int a,b,lson,rson,sum;
}Tree[N << 5];
int a[N << 5],b[N << 5],Root[N << 5];
int cnt,now;
void Build(int &node,int a,int b){
node = ++cnt;
Tree[node].a = a;Tree[node].b = b;
if (a == b) return ;
ll mid(a + b >> 1);
Build(Tree[node].lson,a,mid);
Build(Tree[node].rson,mid + 1,b);
}
void Insert(int pre,int &pos){
pos = ++cnt;
Tree[pos].lson = Tree[pre].lson;Tree[pos].rson = Tree[pre].rson;
Tree[pos].a = Tree[pre].a;Tree[pos].b = Tree[pre].b;
Tree[pos].sum = Tree[pre].sum + 1;
if (Tree[pos].a == Tree[pos].b) return ;
ll mid = (Tree[pos].a + Tree[pos].b >> 1);
if (mid >= now) Insert(Tree[pre].lson,Tree[pos].lson);
else Insert(Tree[pre].rson,Tree[pos].rson);
}
int Query(int pre,int pos,int k){
if (Tree[pos].lson == Tree[pos].rson) return b[Tree[pos].a];
ll q = Tree[Tree[pos].lson].sum - Tree[Tree[pre].lson].sum;
if (q >= k) Query(Tree[pre].lson,Tree[pos].lson,k);
else Query(Tree[pre].rson,Tree[pos].rson,k - q);
}
int main(){
cin >> n >> m;
for (int i = 1;i <= n;i++){
cin >> a[i];
b[i] = a[i];
}
sort(b + 1,b + 1 + n);
Build(Root[0],1,n);
for (int i(1);i <= n;i++){
now = lower_bound(b + 1,b + n + 1,a[i]) - b;
Insert(Root[i - 1],Root[i]);
}
for (int i(1),l,r,k;i <= m;i++){
cin >> l >> r >> k;
cout << Query(Root[l - 1],Root[r],k) << endl;
}
return 0;
}
全紫,不知道为什么,数组也开够了啊?