#include <iostream>
#include <fstream>
#include <vector>
#define MAX 100001
using namespace std;
int n,m,ans,a,b,o;
vector<int> v,arb;
void construieste(int st,int dr,int pos){
if(st==dr){
arb[pos]=v[st];
return;
}
int m=(st+dr)/2;
construieste(st,m,pos*2);
construieste(m+1,dr,pos*2+1);
arb[pos]=arb[pos*2]+arb[pos*2+1];
}
void adauga(int st,int dr,int pos){
if(st>a||dr<a)return;
arb[pos]+=b;
if(st==dr)return;
int m=(st+dr)/2;
adauga(st,m,pos*2);
adauga(m+1,dr,pos*2+1);
}
void suma(int st,int dr,int pos){
if(st>=a&&dr<=b){
ans+=arb[pos];
return;
}
if(st>b||dr<a||st==dr)return;
int m=(st+dr)/2;
suma(st,m,pos*2);
suma(m+1,dr,pos*2+1);
}
void query(int st,int dr,int pos,int val){
if(val<0||arb[pos]<val)return;
if(val==arb[pos]){
ans=dr;
return;
}
if(st==dr)return;
int m=(st+dr)/2;
query(st,m,pos*2,val);
query(m+1,dr,pos*2+1,val-arb[pos*2]);
}
int main()
{
ifstream f ("aib.in");
ofstream g ("aib.out");
f>>n>>m; v.resize(n+10);arb.resize(n*4+10);
for(int i=1;i<=n;i++)f>>v[i];
construieste(1,n,1);
for(int i=1;i<=m;i++){
f>>o;
if(o==0){
f>>a>>b;
adauga(1,n,1);
} else if(o==1){
f>>a>>b;
ans=0;
suma(1,n,1);
g<<ans<<'\n';
} else {
f>>a;
ans=0;
query(1,n,1,a);
if(ans)g<<ans<<'\n';
else g<<"-1\n";
}
}
f.close ();
g.close ();
return 0;
}