rt
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e6+10;
const int inf=0x3f3f3f3f;
struct node{
int lc,rc;
ll val;
}t[N<<2];
int a[N];
int tot;
void pushup(int root){
t[root].val=t[t[root].lc].val+t[t[root].rc].val;
}
inline void update(int& root,int lt,int rt,int x,int v){
if(!root) root=++tot;
if(lt==rt){
t[root].val+=v;
return;
}
int mid=lt+(rt-lt>>1);
if(lt<=mid)update(t[root].lc,lt,mid,x,v);
if(rt>mid)update(t[root].rc,mid+1,rt,x,v);
pushup(root);
}
ll query(int root,int lt,int rt,int l,int r){
if(!root)return 0;
if(l<=lt&&r>=rt) return t[root].val;
int mid=lt+(rt-lt>>1);
ll ans=0;
if(l<=mid)ans+=query(t[root].lc,lt,mid,l,r);
if(r>mid)ans+=query(t[root].rc,mid+1,rt,l,r);
return ans;
}
int n,m,rt=1;
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int num;
scanf("%d",&num);
update(rt,1,n,i,num);
}
while(m--){
int op;
scanf("%d",&op);
if(op==1){
int x,y,k;
scanf("%d%d",&x,&k);
update(rt,1,n,x,k);
}else{
int x,y;
scanf("%d%d",&x,&y);
printf("%lld\n",query(1,1,n,x,y));
}
}
return 0;
}