10pts,只过了第一个点
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5;
int n,m,i,b[maxn],L[4*maxn],R[4*maxn],s[4*maxn],num,num1,root[maxn],c[maxn],l,r,k;
struct Node{
int num,Id;
}a[maxn];
bool cmp(Node x,Node y){return x.num<y.num;}
int make_tree(int l,int r){
int now=++num1;
if (l<r){
int mid=(l+r)>>1;
L[now]=make_tree(l,mid);
R[now]=make_tree(mid+1,r);
}
return now;
}
int change_tree(int numk,int l,int r,int x){
int now=++num1;
L[now]=L[numk];R[now]=R[numk];
s[now]=s[numk]+1;
if (l<r){
int mid=(l+r)>>1;
if (x<=mid) L[now]=change_tree(L[now],l,mid,x);
else R[now]=change_tree(R[now],mid+1,r,x);
}
return now;
}
int find_tree(int now,int las,int l,int r,int x){
if (l==r) return l;
int d=s[L[las]]-s[L[now]];
int mid=(l+r)>>1;
if (x<=d) return find_tree(L[now],L[las],l,mid,x);
else return find_tree(R[now],R[las],mid+1,r,x);
}
int main(){
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%d",&a[i].num),a[i].Id=i;
sort(a+1,a+n+1,cmp);
b[a[1].Id]=++num;c[num]=a[1].num;
for (i=2;i<=n;i++){
if (a[i].num!=a[i-1].num) b[a[i].Id]=++num;
else b[a[i].Id]=num;
c[num]=a[i].num;
}
root[0]=make_tree(1,num);
for (i=1;i<=n;i++)
root[i]=change_tree(root[i-1],1,num,b[i]);
for (i=1;i<=m;i++){
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",c[find_tree(root[l-1],root[r],1,num,k)]);
}
return 0;
}