#include<bits/stdc++.h>
using namespace std;
FILE *f=fopen("datorii.in","r");
FILE *g=fopen("datorii.out","w");
const int NMAX = 15004;
int N,Q;
int Tree[4*NMAX];/// aici vom retine sumele de intervale
void Build(int nod,int left,int right)
{
if(left==right)
{
fscanf(f,"%d",&Tree[nod]);
return;
}
int mid = left + (right-left)/2;
Build(2*nod,left,mid);
Build(2*nod+1,mid+1,right);
Tree[nod] = Tree[2*nod]+Tree[2*nod+1];
}
void Read()
{
fscanf(f,"%d%d",&N,&Q);
Build(1,1,N);
}
int Query(int nod,int left,int right,int x,int y)
{
/// daca intervalul [left,right] se afla in totalitate in [x,y]
if(x<=left&&right<=y)
return Tree[nod];
int mid = left + (right-left)/2;
int sum1=0,sum2=0;
/// daca intervalul [x,y] se intersecteaza cu [left,mid]
if(x<=mid)
sum1 = Query(2*nod,left,mid,x,y);
/// daca intervalul [x,y] se intersecteaza cu [mid+1,right]
if(y>=mid+1)
sum2 = Query(2*nod+1,mid+1,right,x,y);
return sum1+sum2;
}
void Update(int nod,int left,int right,int pos,int val)
{
/// fiind in intervalul corespunzator daca left==right
/// stim ca am ajuns la pozitia pos
if(left==right)
{
Tree[nod]-=val;
if(Tree[nod]<0)Tree[nod]=0;
return;
}
int mid = left + (right-left)/2;
/// daca pos se afla in intervalul [left,mid]
if(pos<=mid)
Update(2*nod,left,mid,pos,val);
/// altfel daca pos se afla in intervalul [mid+1,right]
else Update(2*nod+1,mid+1,right,pos,val);
/// actualizam din nou nodurile afectate de modificari
Tree[nod] = Tree[2*nod] + Tree[2*nod + 1];
}
void Solve()
{
for(int q=1;q<=Q;q++)
{
int tip,x,y;
fscanf(f,"%d%d%d",&tip,&x,&y);
if(tip==1)
fprintf(g,"%d\n",Query(1,1,N,x,y));
else Update(1,1,N,x,y);
}
}
int main()
{
Read();
Solve();
fclose(f);
fclose(g);
return 0;
}