#include <cstdio>
struct node{
node* l,*r;
int d,lr,rr;
};
node* root;
void remove(int i,int val){
node*tmp=root;
while(tmp){
tmp->d-=val;
if(i>((tmp->rr+tmp->lr)/2))
tmp=tmp->r;
else
tmp=tmp->l;
}
}
int get(node* tmp,int l,int r){
int val=0;
if(l==tmp->lr&&r==tmp->rr)
return tmp->d;
if(r<=((tmp->rr+tmp->lr)/2))
return get(tmp->l,l,r);
if(l>((tmp->rr+tmp->lr)/2))
return get(tmp->r,l,r);
return get(tmp->l,l,((tmp->rr+tmp->lr)/2))+get(tmp->r,((tmp->rr+tmp->lr)/2)+1,r);
}
inline node*init(){
node* tmp=new node;
tmp->l=tmp->r=NULL;
tmp->d=0;
return tmp;
}
node* init(int l,int r){
node* tmp=init();
tmp->lr=l;
tmp->rr=r;
if(l==r)
scanf("%d",&(tmp->d));
else{
tmp->l=init(l,(l+r)/2);
tmp->r=init((l+r)/2+1,r);
tmp->d=get(tmp->l,l,(l+r)/2)+get(tmp->r,(l+r)/2+1,r);
}
return tmp;
}
int main(){
int n,m;
int i,j,a,b;
freopen("datorii.in","rt",stdin);
freopen("datorii.out","wt",stdout);
scanf("%d%d",&n,&m);
root=init(0,n-1);
while(m--){
scanf("%d%d%d",&n,&a,&b);
if(n==1)
printf("%d\n",get(root,a-1,b-1));
else
remove(a-1,b);
}
return 0;
}