样例全输出同一个数(悲
#include<bits/stdc++.h>
#define int long long
#define M (1<<31)
using namespace std;
int tot;
int n,m,Q;
struct GJX{
int ls,rs,sum;
}a[10000086];
int b[10000086];
int c[10000086];
int root[10000086];
int newNode(){
return ++tot;
}
int build_tree(int l,int r){
int node=newNode();
if(l==r){
return node;
}
int mid=(l+r)/2;
a[node].ls=build_tree(l,mid);
a[node].rs=build_tree(mid+1,r);
return node;
}
int build_chain(int l,int r,int x,int k){
int node=newNode();
a[node].ls=a[x].ls,a[node].rs=a[x].rs;
a[node].sum=a[x].sum+1;
if(l==r){
return node;
}
int mid=(l+r)/2;
if(k<=mid){
a[node].ls=build_chain(l,mid,a[x].ls,k);
}
else{
a[node].rs=build_chain(mid+1,r,a[x].rs,k);
}
}
int query(int u,int v,int l,int r,int k){
if(l==r)return l;
int x=a[a[v].ls].sum-a[a[u].ls].sum;
int mid=(l+r)/2;
if(x>=k)return query(a[u].ls,a[v].ls,l,mid,k);
else return query(a[u].rs,a[v].rs,mid+1,r,k-x);
}
signed main()
{
cin>>n>>Q;
for(int i=1;i<=n;i++)cin>>b[i],c[i]=b[i];
sort(b+1,b+1+n);
m=unique(b+1,b+1+n)-b-1;
root[0]=build_tree(1,m);
for(int i=1;i<=n;i++){
c[i]=lower_bound(b+1,b+1+m,c[i])-b;
root[i]=build_chain(1,m,root[i-1],c[i]);
}
while(Q--){
int x,y,z;
cin>>x>>y>>z;
int p=query(root[x-1],root[y],1,m,z);
cout<<b[p]<<endl;
}
return 0;
}