#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
int n,j;
void update(int poz,int value,long long a[]){
do{
a[poz]+=value;
poz=poz+(poz&-poz); //+cea mai mica putere a lui 2 din descompunerea lui poz
//int c=0; while( !( (1<<c) & poz) ) c++; poz+=1<<c; c++;
} while (poz<=n);
}
long long sum(int poz,long long a[]){
long long s=0;
while(poz){
s+=a[poz];
poz= poz & (poz-1); //poz-(poz & -poz);
}
return s;
}
int search(long long s, long long a[]){
int poz=1,i=0;
while(poz<=n) poz=poz<<1;
poz=poz>>1;
while(poz){
if(i+poz<=n && a[i+poz]<=s){
i+=poz;
s-=a[i];
if(s==0) return i;
}
poz=poz>>1;
}
return -1;
}
int main(){
int i,x,c,m,y;
long long s;
FILE *in=fopen("aib.in","r"),*out=fopen("aib.out","w");
fscanf(in,"%i %i",&n,&m);
long long a[n+1];
memset(a,0,sizeof(a));
for(i=1;i<=n;i++){
fscanf(in,"%i",&x);
update(i,x,a);
}
for(i=1;i<=m;i++){
fscanf(in,"%i",&c); if(c==1 || c==2 ) j++;
switch(c){
case 0:{
fscanf(in,"%i %i",&x,&y);
update(x,y,a);
break;
}
case 1:{
fscanf(in,"%i %i",&x,&y);
fprintf(out,"%lld\n",sum(y,a)-sum(x-1,a));
break;
}
case 2:{
fscanf(in,"%lld",&s); //if(j==58 && (c==1 || c==2) ) for(int k=1;k<=n;k++) cout<<a[k]<<" "; cout<<endl;
fprintf(out,"%i\n",search(s,a));
break;
}
default: break;
}
}
fclose(in); fclose(out);
return 0;
}