#include<bits/stdc++.h>
using namespace std;
const int max_arr=500005;
const int max_tree=2000005;
int arr[max_arr];
int tree[max_tree];
int n,m;
inline int read(){
register int x=0,f=1,ch=getchar();
while(!isdigit(ch))f=ch=='-'?-1:1,ch=getchar();
while(isdigit(ch))x=x*10+ch-48,ch=getchar();
return x*f;
}
void build_tree(int arr[],int tree[],int node,int start,int end)
{
if(start==end)
{
tree[node]=arr[start];
}
else
{
int mid=(start+end)/2;
int left_node=2*node;
int right_node=2*node+1;
build_tree(arr,tree,left_node,start,mid);
build_tree(arr,tree,right_node,mid+1,end);
tree[node]=tree[left_node]+tree[right_node];
}
}
void update_tree(int arr[],int tree[],int node,int start,int end,int idx,int val)
{
if(start==end)
{
arr[idx]+=val;
tree[node]+=val;
}
else
{
int mid=(start+end)/2;
int left_node=2*node;
int right_node=2*node+1;
if(idx>=start&&idx<=mid) update_tree(arr,tree,left_node,start,mid,idx,val);
else update_tree(arr,tree,right_node,mid+1,end,idx,val);
tree[node]=tree[left_node]+tree[right_node];
}
}
int query_tree(int arr[],int tree[],int node,int start,int end,int L,int R)
{
if(R<start||L>end)
{
return 0;
}
if(start==end)
{
return tree[node];
}
else
{
int mid=(start+end)/2;
int left_node=node*2;
int right_node=node*2+1;
return tree[node]=query_tree(arr,tree,left_node,start,mid,L,R)+query_tree(arr,tree,right_node,mid+1,end,L,R);
}
}
int main()
{
n=read(); m=read();
for(int i=1;i<=n;i++) arr[i]=read();
build_tree(arr,tree,1,1,n);
for(int i=1;i<=m;i++)
{
int a,x,y;
scanf("%d%d%d",&a,&x,&y);
if(a==1) update_tree(arr,tree,1,1,n,x,y);
else printf("%d\n",query_tree(arr,tree,1,1,n,x,y));
}
return 0;
}