主席树
这只是一个模板...具体算法qsc已经讲的很清楚了(QAQ)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
struct node {
int l,r,sum;
}d[8400000];
int a[210000],b[210000],cnt,root[210000],tot;
map<int,int>id;
map<int,int>wh;
void update(int le,int ri,int &x,int y,int pos){
d[++cnt]=d[y];
d[cnt].sum++;
x=cnt;
if(le==ri)return;
int mid=(le+ri)>>1;
if(mid>=pos)update(le,mid,d[x].l,d[y].l,pos);
else update(mid+1,ri,d[x].r,d[y].r,pos);
}
int que(int le,int ri,int x,int y,int k){
if(le==ri)return le;
int mid=(le+ri)>>1;
int s=d[d[y].l].sum-d[d[x].l].sum;
if(s>=k)return que(le,mid,d[x].l,d[y].l,k);
else return que(mid+1,ri,d[x].r,d[y].r,k-s);
}
int main()
{ int n,m,i,j,k,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
for(i=1;i<=n;i++)
if(!id[b[i]]){
id[b[i]]=++tot;
wh[tot]=b[i];
}
for(i=1;i<=n;i++)update(1,n,root[i],root[i-1],id[a[i]]);
for(i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&k);
printf("%d\n",wh[que(1,n,root[x-1],root[y],k)]);
}
return 0;
}