#include<fstream>
using namespace std;
int arb[45000],a,b,x,y,n,m,t,sol,poz,val,st,dr;
ifstream in("datorii.in"); ofstream out("datorii.out");
void update(int nod, int st, int dr, int poz, int val){
if(st==dr){
arb[nod]+=val;
}
else{
int m=(st+dr)/2;
if(poz<=m) update(nod*2,st,m,poz,val);
else update(nod*2+1,m+1,dr,poz,val);
arb[nod]=arb[nod*2]+arb[nod*2+1];
}
}
void querry(int nod, int st, int dr){
if(a<=st && dr<=b){
sol+=arb[nod]; //daca intervalul curent (st,dr) este inclus in intervalul cautat, se aduna la solutie
return ;
}
int m=(st+dr)/2;
if(a<=m) querry(nod*2,st,m); //daca are rost sa caut pe fiul stanga a nodului (capatul cautat e mai mic decat capatul unde merg
if(b>m) querry(nod*2+1, m+1, dr); //idem
}
int main(){
//Solutia 2: Arbori de intervale
in>>n>>m;
for(int i=1;i<=n;++i){in>>x; update(1,1,n,i,x);}
for(int i=1;i<=m;++i){
in>>t;
if(!t){
in>>poz>>val;
update(1,1,n,poz,-val);
}
else{
in>>a>>b;
sol=0;
querry(1,1,n);
out<<sol<<'\n';
}
}
out.close();
return 0;
}