#include <fstream>
#include <vector>
using namespace std;
ifstream cin("datorii.in");
ofstream cout("datorii.out");
int n,m;
vector<int> v,tree;
void read(){
cin>>n>>m;
v.resize(n+1);
tree.resize(4*n);
for(int i=1;i<=n;i++){
cin>>v[i];
}
}
void buildTree(int l,int r,int node){
if(l==r){
tree[node]=v[l];
return;
}
int mid=(l+r)/2;
buildTree(l,mid,2*node);
buildTree(mid+1,r,2*node+1);
tree[node]=tree[2*node]+tree[2*node+1];
}
void update(int l,int r,int node,int pos,int val){
if(l==r && l==pos){
tree[node]-=val;
return;
}
if(!(pos>=l && pos<=r)){
return;
}
int mid=(l+r)/2;
if(pos<=mid)
update(l,mid,2*node,pos,val);
else
update(mid+1,r,2*node+1,pos,val);
tree[node]=tree[2*node]+tree[2*node+1];
}
bool isInside(int l1,int r1,int l2,int r2){
if((l1<=l2 && l2<=r1) && (l1<=r2 && r2<=r1)){
return true;
}
return false;
}
bool isIntersected(int l1,int r1,int l2,int r2){
if((l1<=l2 && l2<=r1) || (l1<=r2 && r2<=r1)){
return true;
}
return false;
}
int query(int l,int r,int node,int lFind,int rFind){
if((lFind<=l && l<=rFind) && (lFind<=r && r<=rFind)){//isInside(lFind,rFind,l,r)){
return tree[node];
}
else if(!isIntersected(l,r,lFind,rFind)){
return 0;
}
int mid=(l+r)/2,val1,val2;
val1=query(l,mid,2*node,lFind,rFind);
val2=query(mid+1,r,2*node+1,lFind,rFind);
return val1+val2;
}
void solve(){
buildTree(1,n,1);
int a,b,c;
for(int i=1;i<=m;i++){
cin>>a>>b>>c;
if(a==0){
update(1,n,1,b,c);
}
else{
cout<<query(1,n,1,min(c,b),max(c,b))<<"\n";
}
}
}
int main(){
read();
solve();
return 0;
}