#include<cstdio>
#define nmax 100005
int n,m,a[nmax],arb[4*nmax+50],x,start,finish,index,pos,sum,p;
void update(int nod,int left,int right){
if( left == right){
arb[nod]+=x;
return ;
}
int div=(left+right)/2;
if(pos<=div)update(2*nod,left,div);
else update(2*nod+1,div+1,right);
arb[nod]=arb[2*nod]+arb[2*nod+1];
}
void query(int nod,int left,int right){
if(start<=left && right<=finish){
sum+=arb[nod];
return ;
}
int div=(left+right)/2;
if(start<=div)query(2*nod,left,div);
if(finish>div)query(2*nod+1,div+1,right);
}
void search1(int nod,int right){
if( arb[nod]==p ){
index=right;
}
int div=(1+right)/2;
if(arb[2*nod]>=p)search1(2*nod,div);
}
int main(void){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int n,m,i,q;
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;++i){
scanf("%d ",&x);
pos=i;
update(1,1,n);
}
for(i=1;i<=m;++i){
scanf("%d %d ",&x,&p);
if(x==0){ scanf("%d\n",&q); x=q; pos=p; update(1,1,n); }
if(x==1){ scanf("%d\n",&q); sum=0; start=p; finish=q; query(1,1,n); printf("%d\n",sum); }
if(x==2){ index=0; search1(1,n); printf("%d\n",index); }
}
return 0;
}