第K小数
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 100010;
struct Node{
int l,r;
int cnt;
}tr[4*N+17*N];
int n,m;
int a[N];
vector<int> nums;
int root[N],idx;
int find(int x){
return lower_bound(nums.begin(),nums.end(),x)-nums.begin();
}
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 x,int p,int l, int r){
int q=idx++;
if(l==r){
tr[q].cnt++;
return q;
}
int mid=l+r>>1;
if(x>mid){
tr[q].l=tr[p].l;
tr[q].r=insert(x,tr[p].r,mid+1,r);
}
else{
tr[q].r=tr[p].r;
tr[q].l = insert(x,tr[p].l,l,mid);
}
tr[q].cnt=tr[tr[q].l].cnt+tr[tr[q].r].cnt;
return q;
}
int query(int p,int q,int k,int l,int r){
if(l==r)return nums[l];
int left=tr[tr[q].l].cnt-tr[tr[p].l].cnt;
int mid=l+r>>1;
if(left>=k)return query(tr[p].l,tr[q].l,k,l,mid);
else return query(tr[p].r,tr[q].r,k-left,mid+1,r);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
nums.push_back(a[i]);
}
sort(nums.begin(),nums.end());
nums.erase(unique(nums.begin(),nums.end()),nums.end());
root[0]=build(0,nums.size()-1);
for(int i=1;i<=n;i++)root[i]=insert(find(a[i]),root[i-1],0,nums.size()-1);
while(m--){
int l,r,k;
cin>>l>>r>>k;
cout<<query(root[l-1],root[r],k,0,nums.size()-1)<<endl;
}
}