#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N*21],rt[N*21],b[N*21],n,q;
int read(){
int ans=0,flag=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')flag=-1,ch=getchar();}
while(ch>='0'&&ch<='9'){ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();}
return ans*flag;
}
struct tree{
int d[N*21],lc[N*21],rc[N*21],cnt=0;
inline void build(int s,int t,int &p){
t=++cnt;if(s==t){return ;}
int m=s+((t-s)>>1);
build(s,m,lc[p]),build(m+1,t,rc[p]);
}
inline void update(int x,int s,int t,int &p,int pre){
p=++cnt,lc[p]=lc[pre],rc[p]=rc[pre],d[p]=d[pre]+1;
if(s==t){return ;}int m=s+((t-s)>>1);
if(x<=m)update(x,s,m,lc[p],lc[pre]);
else update(x,m+1,t,rc[p],rc[pre]);
}
inline int getans(int s,int t,int u,int v,int k){
int ans=0,m=s+((t-s)>>1),x=d[lc[v]]-d[lc[u]];
if(s==t)return s;
if(x>=k)ans=getans(s,m,lc[u],lc[v],k);
else ans=getans(m+1,t,rc[u],rc[v],k-x);
}
}T;
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)b[i]=a[i];
sort(b+1,b+1+n);int len=unique(b+1,b+1+n)-b-1;
T.build(1,len,rt[0]);
for(int i=1;i<=n;i++){
int x=lower_bound(b+1,b+1+len,a[i])-b;
T.update(x,1,len,rt[i],rt[i-1]);
}
for(int i=1;i<=q;i++){
int l,r,k;scanf("%d%d%d",&l,&r,&k);
printf("%d\n",b[T.getans(1,len,rt[l-1],rt[r],k)]);
}
return 0;
}
RE,但是下载的数据可以出结果
放在luoguIDE上也正常,但是O2就运行错误
求助