代码
#include <cstdio>
#include <cstring>
#define Max 1000000000
#define Mid (l+r>>1)
#define D(x) (T[T[x2].x].v-T[T[x1].x].v)
using namespace std;
struct node{
int l,r,v;
}T[15000000];
int k,n,m,s,t,num,Q,o,st[2000005];
void add(int &x1,int x2,int l,int r){
x1=++num;
T[x1]=T[x2];
T[x1].v++;
if (l==r) return;
if (l<=o && o<=Mid) {add(T[x1].l,T[x2].l,l,Mid); return;}
add(T[x1].r,T[x2].r,Mid+1,r);
}
int que(int x1,int x2,int l,int r,int O){
if (l==r) return l;
if (D(l)+O<k) return que(T[x1].r,T[x2].r,Mid+1,r,D(l)+O);
return que(T[x1].l,T[x2].l,l,Mid,O);
}
int main(){
freopen("1.txt","r",stdin);
scanf("%d%d",&n,&m);
for (int i=1; i<=n; i++){
scanf("%d",&o);
add(st[i],st[i-1],-Max,Max);
}
while (m--){
scanf("%d%d%d",&s,&t,&k);
printf("%d\n",que(st[s-1],st[t],-Max,Max,0));
}
}