#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int ver[maxn];
int tot,n,m;
struct st{
int l,r,sum;
}tre[maxn<<5];
int lsh[maxn],a[maxn];
int build(int l,int r){
int root=++tot;
tre[root].l =root;
tre[root].r =root;
tre[root].sum =0;
return root;
}
int change(int node,int l,int r,int x){
int root=++tot;
st &rt=tre[root];
rt=tre[node];
rt.sum +=1;
if(l==r) return root;
int mid=(l+r)>>1;
if(x<=mid) rt.l =change(rt.l ,l,mid,x);
else rt.r =change(rt.r ,mid+1,r,x);
return root;
}
int query(int t1,int t2,int l,int r,int k){
if(l==r) return l;
st &s1=tre[t1];
st &s2=tre[t2];
int x=tre[s2.l ].sum -tre[s1.l ].sum ;
int mid=(l+r)>>1;
if(x>=k) return query(s1.l ,s2.l ,l,mid,k);
else return query(s1.r ,s2.r ,mid+1,r,k-x);
}
int main()
{
scanf("%d%d",&n,&m);
tot=0;
//离散化
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
lsh[i]=a[i];
}
sort(lsh+1,lsh+n+1);//排序
int cnt;
cnt=unique(lsh+1,lsh+n+1)-lsh-1;//去重
//二分查找
ver[0]=build(1,cnt);
for(int i=1;i<=n;i++){
a[i]=lower_bound(lsh+1,lsh+cnt+1,a[i])-lsh;
ver[i]=change(ver[i-1],1,cnt,a[i]);
}
int ll,rr,kk;
for(int i=0;i<m;i++){
scanf("%d%d%d",&ll,&rr,&kk);
printf("%d\n",lsh[query(ver[ll-1],ver[rr],1,cnt,kk)]);
}
return 0;
}
10-14
309
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
11-21
159
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交