#include<bits/stdc++.h>
#define mid(x,y) (x+y)>>1
#define getm int m=mid(s,t)
using namespace std;
const int maximum=200009;
int N,M,cnt=0,a[maximum]/*原数组*/,srt[maximum]/*排序数组*/,
ver[maximum];
map<int,int> mp;
struct node{
int l,r,v;
}pzt[maximum<<5];
void build(int s,int t,int p){
if(s==t) return;
getm;int l=cnt++;int r=cnt++;
pzt[p].l=l,pzt[p].r=r;
build(s,m,l),build(m+1,t,r);
return;
}
void wt(int lo,int s,int t,int p){
if(s==t){
pzt[p].v++;return;
}
getm;int nw=cnt++;
pzt[p].v++;
if(lo<=m){
pzt[nw]=pzt[pzt[p].l];
pzt[p].l=nw;
wt(lo,s,m,nw);
}
else if(lo>m){
pzt[nw]=pzt[pzt[p].r];
pzt[p].r=nw;
wt(lo,m+1,t,nw);
}
return;
}
int rd(int k,int s,int t,int p1,int p2){
if(s==t) return srt[s];
int l1=pzt[p1].l,l2=pzt[p2].l;
int num=pzt[l2].v-pzt[l1].v;
getm;
if(k<num){
return rd(k,s,m,l1,l2);
}
else if(k>=num){
return rd(k-num,m+1,t,pzt[p1].r,pzt[p2].r);
}
return -1;
}
int main(){
cin>>N>>M;
for(int i=1;i<=N;i++){//输入
scanf("%d",&a[i]);
srt[i]=a[i];
}
sort(srt+1,srt+N+1);//排序
for(int i=1,j=1;i<=N;i++){//离散化映射
if(srt[i]!=srt[i-1]) mp[srt[i]]=j++;
}
unique(srt+1,srt+1+N);
// for(int j=1;j<=N;j++) cout<<mp[srt[j]]<<' ';cout<<endl;
ver[0]=cnt++;//初始根
build(1,N,0);//建树
for(int i=1;i<=N;i++){//插入
ver[i]=cnt++;//新建根
pzt[ver[i]]=pzt[ver[i-1]];//新根初始化
wt(mp[a[i]],1,N,ver[i]);//写
}
//for(int j=0;j<cnt;j++) printf("p=%d,l=%d,r=%d,v=%d\n",j,pzt[j].l,pzt[j].r,pzt[j].v);
for(int i=1,l,r,k;i<=M;i++){
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",rd(k,1,N,ver[l-1],ver[r]));
}
return 0;
}
样例输出:
26465
26287
26465
26465
26465
很奇怪,像是错位了,但是映射没有问题