RT,全都RE了,但是本地下载数据测试并没有问题。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stdlib.h>
#include <stack>
#include <queue>
#define ri register int
using std::min;
using std::max;
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=4e5+5;
struct Seg_Tree{
int ls,rs,sum;
}tree[N*20];
int n,m,a[N],b[N],frm[N],root[N],ne;
int Find(int x){
int l=1,r=n,ans=0;
while(l<=r){
int mid=l+r>>1;
if(b[mid]>=x)r=mid-1,ans=mid;
else l=mid+1;
}
return ans;
}
void Push_Up(int now){
int ls=tree[now].ls,rs=tree[now].rs;
tree[now].sum=tree[ls].sum+tree[rs].sum;
}
void Add(int las,int now,int x,int l,int r,int fa,int opt,int p){
if(l>x||r<x||l>r)return;
if(!now){
++ne,now=ne;
if(fa){
if(!opt)tree[fa].ls=now;
else tree[fa].rs=now;
}
}
// printf("%d %d %d %d %d %d %d %d\n",las,now,x,l,r,fa,opt,p);
if(l==r){tree[now].sum+=1;return;}
int mid=l+r>>1;
if(mid>=x)Add(tree[las].ls,tree[now].ls,x,l,mid,now,0,p),tree[now].rs=tree[las].rs;
else Add(tree[las].rs,tree[now].rs,x,mid+1,r,now,1,p),tree[now].ls=tree[las].ls;
Push_Up(now);
if(l==1&&r==n)root[p]=now;
}
int Query(int nowl,int nowr,int l,int r,int k){
if(l==r)return l;
int mid=l+r>>1,tmp=tree[tree[nowr].ls].sum-tree[tree[nowl].ls].sum;
if(tmp<k)Query(tree[nowl].rs,tree[nowr].rs,mid+1,r,k-tmp);
else Query(tree[nowl].ls,tree[nowr].ls,l,mid,k);
}
int main(){
n=read(),m=read();
for(ri i=1;i<=n;i++)b[i]=a[i]=read();
std::sort(b+1,b+n+1);
for(ri i=1,x;i<=n;i++)x=Find(a[i]),frm[x]=a[i],a[i]=x;
for(ri i=1;i<=n;i++){
Add(root[i-1],0,a[i],1,n,0,0,i);
}
for(ri i=1;i<=m;i++){
int l=read(),r=read(),k=read();
printf("%d\n",frm[Query(root[l-1],root[r],1,n,k)]);
}
return 0;
}