#include <cstdio>
#define dim 1<<14
using namespace std;
int A[dim],ARB[2*dim],N,M,i,j,x,y,max1,tip,s;
int max(int x,int y)
{
if (x>=y) return x;
else return y;
}
void Update(int nod, int st, int dr,int poz,int val)
{
if (st==dr) //daca in ARB tin minte informatii descpre un interval elementar
{
ARB[nod]=val;//aici apar modificari in ARB
}
else
{
int m=(st+dr)/2;
if (poz<=m) Update(nod*2,st,m,poz,val); //aici actualizam fiul standa
else Update(nod*2+1,m+1,dr,poz,val); //aici actualizam fiul dreapta
ARB[nod]=ARB[nod*2]+ARB[nod*2+1]; //aici apar modificari in ARB am facut maximul dintre cei doi fii
}
}
void Update_cu_scadere(int nod, int st, int dr,int poz,int val)
{
if (st==dr) //daca in ARB tin minte informatii descpre un interval elementar
{
ARB[nod]-=val;//aici apar modificari in ARB
}
else
{
int m=(st+dr)/2;
if (poz<=m) Update_cu_scadere(nod*2,st,m,poz,val); //aici actualizam fiul standa
else Update_cu_scadere(nod*2+1,m+1,dr,poz,val); //aici actualizam fiul dreapta
ARB[nod]=ARB[nod*2]+ARB[nod*2+1]; //aici apar modificari in ARB am facut maximul dintre cei doi fii
}
}
void query(int nod, int st, int dr, int a, int b)
{
if (a<=st&&dr<=b) //daca [st,dr] e inclus in [a,b] returnez informatia dorita , adica fac un maxim
{
s+=ARB[nod]; //aici apar modificari la interogari
}
else
{
int m=(st+dr)/2;
if (a<=m) query(nod*2,st,m,a,b); //interogare fiu st
if (m+1<=b) query (nod*2+1,m+1,dr,a,b); //interogare fiu dreapta
}
}
void afis(int nr)
{
for (int i=1;i<=nr;i++)
printf("%d ",ARB[i]);
printf("\n");
}
int main()
{
freopen("datorii.in","r",stdin);
freopen("datorii.out","w",stdout);
scanf("%d%d\n",&N,&M);
for (i=1;i<=N;i++)
{
scanf("%d",&x);
Update(1,1,N,i,x);
// printf("%d ",x);
}
// printf("\n");
// afis(2*N-1);
//return 0;
while (M>0)
{
M--;
scanf("%d%d%d",&tip,&x,&y);
if (tip==0)
{
Update_cu_scadere(1,1,N,x,y);
// printf("\n scadem %d pe pozitia %d \n",x,y);
// afis(2*N-1);
}
else
{
s=0;
query(1,1,N,x,y);
// afis(2*N-1);
printf("%d\n",s);
}
}
return 0;
}