#include<cstdio>
#define CLOSE fclose(in); fclose(out); return 0;
const int lim = 100010;
int s[lim], cod[lim], arb[lim];
int binary_search(int x){
int ras=0, pas=1<<4, cont=4;
while (pas!=1){
if(x%pas==0){
x/=pas;
ras+=cont;
}
pas>>=1;
--cont;
}
return ras;
}
void modif(int a, int b, int N){
while(a<=N){
arb[a]+=b;
a+=(1<<cod[a]);
}
}
int intrebare(int a, int b){
int s1=0;
while(b>0){
s1+=arb[b];
b-=(1<<cod[b]);
}
int s2=0;
--a;
while(a>0){
s2+=arb[a];
a-=(1<<cod[a]);
}
return s1-s2;
}
int pozitie(int a, int N ){
int poz=0, pas=1<<16,s1,save;
while(pas){
if(poz+pas<=N){
s1=intrebare(1,poz+pas);
if(s1<=a){
poz+=pas;
save=s1;
}
}
pas>>=1;
}
if(save==a)
return poz;
return -1;
}
int main(){
FILE *in=fopen("aib.in","r");
FILE *out=fopen("aib.out","w");
int N, M;
fscanf(in,"%d%d",&N,&M);
for(int i = 1 ; i <= N ; ++i){
fscanf(in,"%d",&s[i]);
s[i]+=s[i-1];
}
int Nr0,st;
for(int i = 1 ; i <= N ; ++i){
Nr0=binary_search(i);
cod[i]=Nr0;
st=i-(1<<Nr0)+1;
arb[i]=s[i]-s[st-1];
}
int val,a,b,RR;
M++;
while (--M){
fscanf(in,"%d",&val);
if(val==0){
fscanf(in,"%d%d",&a,&b);
modif(a,b,N);
}else
if(val==1){
fscanf(in,"%d%d",&a,&b);
RR=intrebare(a,b);
fprintf(out,"%d\n",RR);
}else{
fscanf(in,"%d",&a);
RR=pozitie(a,N);
fprintf(out,"%d\n",RR);
}
}
CLOSE
}