#include <stdio.h>
#define NMAX 100000
int aint[NMAX*4], v[NMAX+1];
void update(int nod, int st, int dr, int poz, int val){
if(st==dr){ ///suntem la o frunza
aint[nod]=val;
}
else{
int mij=(st+dr)/2;
if(poz<=mij){ ///ne ducem in fiul stanga
update(2*nod,st,mij,poz,val);
}
else{ ///ne ducem in fiul dreapta
update(2*nod+1,mij+1,dr,poz,val);
}
aint[nod]=aint[2*nod]+aint[2*nod+1];
}
}
int query(int nod, int st, int dr, int left, int right){
if(st==left&&dr==right){ ///am gasit intervalul
return aint[nod];
}
else{
int mij=(st+dr)/2;
if(right<=mij){ ///ne ducem doar intr un fiu (stg)
return query(2*nod,st,mij,left,right);
}
else if(left>mij){ ///(dr)
return query(2*nod+1,mij+1,dr,left,right);
}
else{ ///avem interval din ambii fii
return query(2*nod,st,mij,left,mij)+query(2*nod+1,mij+1,dr,mij+1,right);
}
}
}
int main()
{
FILE *fin,*fout;
fin=fopen("datorii.in","r");
fout=fopen("datorii.out","w");
int n,m,i,j,q,a,b;
fscanf(fin,"%d%d",&n,&m); /// n nr, m operatii
for(i=1;i<=n;i++){
fscanf(fin,"%d",&v[i]); ///sirul de nr
update(1,1,n,i,v[i]); ///construiesc aintul
}
for(i=1;i<=m;i++){
fscanf(fin,"%d%d%d",&q,&a,&b);
if(q==0){ ///update ///nr se aduna in aint
update(1,1,n,a,v[a]-b); ///a=poz,b=val
}
else if(q==1){ ///suma nr de pe intervalul left,right (a,b)
fprintf(fout,"%d\n",query(1,1,n,a,b)); ///a=left, b=right
}
}
fclose(fin);
fclose(fout);
return 0;
}