第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;
        
    }
}