#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 100010;
int n,m;
int w[N];//记录一下权重
struct node {
	int l,r;//左右区间
	int sum;//总和 
}tr[N*4];

void push_up(int u)//利用它的两个儿子来算一下它的当前节点信息
{
	tr[u].sum = tr[u<<1].sum + tr[u<<1|1].sum;//左儿子u<<1,右儿子u<<1|1 
} 

void build(int u,int l,int r){//当前节点编号 左边界 右边界
	if(l==r)tr[u] = {l,r,w[r]};
	else{
		tr[u]={l,r};
	
		int mid=l+r>>1;
	
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		
		push_up(u);//做完两个儿子push_up 一遍,更新当前节点信息 
		
	} 
	
}

int query(int u,int l,int r){//从根节点开始向下递归寻找
	
	if(l<=tr[u].l && tr[u].r<=r)return tr[u].sum;//说明包含区间
	
	int mid = tr[u].l+tr[u].r>>1;
	int sum = 0;
	
	if(mid>=l)sum += query(u<<1,l,r);//看一下我们当前区间的中点和左边有没有交集
	
	if(r>=mid+1)//看一下我们当前区间的中点和右边有没有交集
	sum += query(u<<1|1,l,r);
	
	return sum; 
	 
	
}

void modify(int u,int x,int v){//节点编号 要修改的位置 要修改的值 
	
	if(tr[u].l==tr[u].r)tr[u].sum+=v;//当前已经是叶子节点
	
	else{
		int mid = tr[u].l+tr[u].r>>1;
		
		if(x<=mid)modify(u<<1,x,v);//在左半边 ,找左二子
	 
		else modify(u<<1|1,x,v);//在右半边, 找右儿子
		
		push_up(u); 
	} 
}



int main(){
	
	scanf("%d%d",&n,&m);
	
	for(int i = 1;i<=n;i++)scanf("%d",&w[i]);
	
	build(1,1,n);
	
	
	while(m--){
		int k,a,b;
		
		cin >> k >> a >> b;
		
		if(!k)printf("%d\n",query(1,a,b));
		
		else modify(1,a,b);//根节点下标,要修改的位置,要修改的值 
	}
	
	
	return 0;
}