#include<iostream>
const int Max=1e6+1;
using namespace std;
long long element[Max];
struct segment_tree{
struct Node{
int left,right,sum;
}Tree[4*Max+5];
void Build(int i,int l,int r){
Tree[i].sum=0,Tree[i].left=l,Tree[i].right=r;
if(l==r){
Tree[i].sum=element[l];
return;
}
int mid=l+((r-l)>>2);
Build((i<<1),l,mid);
Build((i<<1)+1,mid+1,r);
Tree[i].sum=Tree[(i<<1)].sum+Tree[(i<<1)+1].sum;
}
void Add(int i,int n,int ad){
if(Tree[i].left==Tree[i].right){
Tree[i].sum+=ad;
return;
}
if(n<=Tree[(i<<1)].right){
Add((i<<1),n,ad);
}else{
Add((i<<1)+1,n,ad);
}
Tree[i].sum=Tree[(i<<1)].sum+Tree[(i<<1)+1].sum;
return;
}
int Search(int i,int l,int r){
if(l<=Tree[i].left&&Tree[i].right<=r){
return Tree[i].sum;
}
if(l>Tree[i].right||r<Tree[i].left){
return 0;
}
int s=0;
if(l<=Tree[(i<<1)].right){
s+=Search((i<<1),l,r);
}
if(r>=Tree[(i<<1)].left){
s+=Search((i<<1)+1,l,r);
}
return s;
}
}ST;
int main(){
int n,opo_num;
std::ios::sync_with_stdio(0);
cin>>n>>opo_num;
for(int i=1;i<=n;i++){
cin>>element[i];
}
ST.Build(1,1,n);
int l,r,ad;
for(int i=1;i<=opo_num;i++){
int opo;
cin>>opo;
if(opo==1){
cin>>n>>ad;
ST.Add(1,n,ad);
}else{
cin>>l>>r;
cout<<ST.Search(1,l,r)<<'\n';
}
}
}