#include <bits/stdc++.h>
using namespace std;
const int nmx = 1e5+1;
#if 1
#define cin fin
#define cout fout
ifstream fin("aib.in");
ofstream fout("aib.out");
#endif
int a[nmx];
int t[nmx*4];
void create(int idx,int st,int dr){
if(st == dr){
t[idx] = a[st];
}
else{
int md = (st + dr)/2;
create(idx*2,st,md);
create(idx*2+1,md+1,dr);
t[idx] = t[idx*2] + t[idx*2+1];
}
}
void printt(int idx,int st,int dr){
if(st == dr){
cout << t[idx] << " ";
}
else{
int md = (st + dr)/2;
printt(idx*2,st,md);
printt(idx*2+1,md+1,dr);
}
}
void update(int idx,int st,int dr, int p, int add){
if(st == dr){
t[idx] += add;
}
else{
int md = (st+dr)/2;
if(p<=md)
update(idx*2,st,md,p,add);
else
update(idx*2+1,md+1,dr,p,add);
t[idx] = t[idx*2] + t[idx*2+1];
}
}
int query(int idx,int st,int dr,int a,int b){
if(a>b)
return 0;
if(st == a && dr == b){
return t[idx];
}
int md = (st+dr)/2;
return query(idx*2,st,md,a,min(md,b)) + query(idx*2+1,md+1,dr,max(md+1,a),b);
}
int query2(int idx,int st,int dr,int x){
if(x == t[idx]){
return dr;
}
else if (st == dr){
return -1;
}
else{
int md = (st+dr)/2;
int res = -1;
if(t[idx*2]>=x)
res = max(res,query2(idx*2,st,md,x));
else
res = max(res,query2(idx*2+1,md+1,dr,x-t[idx*2]));
return res;
}
}
int main() {
int n,m;
cin >> n >> m;
for(int i=1;i<=n;i++)
cin >> a[i];
create(1,1,n);
while(m--){
int op,x,y;
cin >> op;
if(op == 0){
cin >> x >> y;
update(1,1,n,x,y);
}
else if(op == 1){
cin >> x >> y;
cout << query(1,1,n,x,y)<<"\n";
}
else{
cin >> x;
cout << query2(1,1,n,x) << "\n";
}
}
}