#include<iostream>
#define low(x) (x&(-x))
using namespace std;
const int N=2e5+5;
int n,m;
struct que{
int id,l,r,v,op;
que(const int &I=0,const int &L=0,const int &R=0,const int &V=0,const int &O=0){
id=I,l=L,r=R,v=V,op=O;
}
}a[N<<1],a1[N<<1],a2[N<<1];
int tot,ans[N],dn;
int c[N<<1];
void add(int x,int k){
for(;x<=n;x+=low(x))c[x]+=k;
}
int query(int x){
int sum=0;
for(;x;x-=low(x))sum+=c[x];
return sum;
}
void clear(int x){
for(;x<=n;x+=low(x))c[x]=0;
}
void cdq(int l,int r,int L,int R){
if(L>R)return;
if(l==r){
for(int i=L;i<=R;i++){
if(a[i].op)ans[a[i].id]=l;
}
return;
}
int mid=(l+r)>>1,sum1=0,sum2=0;
for(int i=L;i<=R;i++){
if(a[i].op){
int sum=query(a[i].r)-query(a[i].l-1);
if(a[i].v<=sum){
a1[++sum1]=a[i];
}else{
a2[++sum2]=a[i];
a2[sum2].v-=sum;
}
}else{
if(a[i].v<=mid){
a1[++sum1]=a[i];
if(a[i].id==0)continue;
add(a[i].id,1);
}else{
a1[++sum2]=a[i];
}
}
}
for(int i=1;i<=sum1;i++){
a[i+L-1]=a1[i];
}
for(int i=1;i<=sum2;i++){
a[L+sum1+i-1]=a2[i];
}
for(int i=1;i<=sum1;i++){
clear(a1[i].id);
}
cdq(l,mid,L,L+sum1-1),cdq(mid+1,r,L+sum1,R);
}
int main(){
cin>>n>>m;
int minn=1e9,maxx=0;
for(int i=1;i<=n;i++){
int z;
cin>>z;
a[++tot]=que(i,0,0,z,0);
minn=min(minn,z);
maxx=max(maxx,z);
}
while(m--){
dn++;
int l,r,k;
cin>>l>>r>>k;
a[++tot]=que(dn,l,r,k,1);
}
cdq(minn,maxx,1,tot);
for(int i=1;i<=dn;i++){
cout<<ans[i]<<"\n";
}
return 0;
}