#include <stdlib.h>
#include <cstdio>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <math.h>
#include <algorithm>
#define mem(t, v) memset ((t) , v, sizeof(t))
#define INF 0x3f3f3f3f
using namespace std;
const int MAX=500050;
int in[MAX];
int n,m,a,x,k;
struct node{
int l,r,sum;
}tree[MAX*4]; //空间要足够大
void Build(int i,int r,int l){ //创建
//printf("%d %d %d**\n",i,r,l);
tree[i].r=r,tree[i].l=l;
if(r==l){
tree[i].sum=in[l];
return ;
}
int mid=(l+r)>>1;
Build(i*2,r,mid);
Build(2*i+1,mid+1,l);
tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
void add(int i,int dis,int k){ //单点修改
if(tree[i].l==tree[i].r){
tree[i].sum+=k;
return ;
}
if(dis<=tree[i*2].l) add(i*2,dis,k);
else add(i*2+1,dis,k);
tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
int Search(int i,int r,int l){ //区间查询
//printf("%d %d %d--\n",i,tree[i].sum);
if(tree[i].l<=l&&tree[i].r>=r)
return tree[i].sum;
if(tree[i].r>l||tree[i].l<r)return 0;
int s=0;
if(tree[i*2].l>=r)s+=Search(i*2,r,l);
if(tree[i*2+1].r<=l)s+=Search(i*2+1,r,l);
return s;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&in[i]);
Build(1,1,n);
while(m--){
scanf("%d%d%d",&a,&x,&k);
if(a==1){
add(1,x,k);
}
else {
int ans=Search(1,x,k);
printf("%d\n",ans);
}
}
return 0;
}