#include<bits/stdc++.h>
using namespace std;
#define MAXN 100003
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, a[MAXN], t[4*MAXN], sum;
void pre(int node, int b, int e){
if(b==e){
t[node]=a[b];
return;
}
int m=b+e>>1;
pre(node*2, b, m);
pre(node*2+1, m+1, e);
t[node]=t[node*2]+t[node*2+1];
}
void query(int node, int b, int e, int l, int r){
if(b>=l && e<=r){
sum+=t[node];
return;
}
if(e<l || b>r)
return;
int m=b+e>>1;
query(node*2, b, m, l, r);
query(node*2+1, m+1, e, l, r);
}
int query2(int node, int b, int e, int val){
if(b==e)
return b;
int m=b+e>>1;
if(val<=t[node*2])
return query2(node*2, b, m, val);
else
return query2(node*2+1, m+1, e, val);
}
void update(int node, int b, int e, int pos, int val){
if(b==e){
t[node]+=val;
return;
}
int m=b+e>>1;
if(pos<=m) update(node*2, b, m, pos, val);
else update(node*2+1, m+1, e, pos, val);
t[node]=t[node*2]+t[node*2+1];
}
int main ()
{
int i, x, y, type;
fin>>n>>m;
for(i=1; i<=n; ++i) fin>>a[i];
pre(1, 1, n);
while(m--){
fin>>type>>x; // x pos; 2 doar x
if(type==0){
fin>>y;
update(1, 1, n, x, y);
}
else if(type==1){
fin>>y;
sum=0;
query(1, 1, n, x, y);
fout<<sum<<'\n';
} else
fout<<query2(1, 1, n, x)<<'\n';
}
return 0;
}