//v3 - cu arbori de intervale (storsi)
#include <stdio.h>
long arbore[150000]; //nodul n are fiii 2n, 2n+1
long a[15000], n, m;
long op, t, v;
//functie de construit arborele (recursiva)
long arb(long nod, long st, long dr);
//functie de interogat arborele (recursiva)
long suma(long nod, long st, long dr, long sti, long dri);
//functie de actualizat arborele (recursiva)
void scade(long nod, long st, long dr, long t, long v);
//si in sfarsit ...
int main (void)
{
int i;
freopen("datorii.in", "r", stdin);
freopen("datorii.out", "w", stdout);
scanf("%ld%ld", &n, &m);
for(i=0; i<n; i++)
scanf("%ld", &a[i]);
//crestem copacu' ...
arb(1, 0, n-1);
//... si apoi il scuturam
for(i=0; i<m; i++)
{
scanf("%ld%ld%ld", &op, &t, &v);
if(op)
printf("%ld\n", suma(1, 0, n-1, t-1, v-1));
else
scade(1, 0, n-1, t-1, v);
}
//gata. noah binie?
return 0;
}
//============================================
//functie de construit arborele (recursiva)
long arb(long nod, long st, long dr)
{
long s1 = 0, s2 = 0, mij;
if(st==dr)
{
arbore[nod] = a[st];
}
else
{
mij = (st+dr) >> 1;
if(st<=mij)
s1 = arb(nod<<1, st, mij);
if(mij<dr)
s2 = arb(nod*2+1, mij+1, dr);
arbore[nod] = s1 + s2;
}
return arbore[nod];
}
//--------------------------------------------
//functie de interogat arborele (recursiva)
long suma(long nod, long st, long dr, long sti, long dri)
{
long mij;
if(st==sti && dr==dri)
return arbore[nod];
mij = (st+dr) >> 1;
if(dri<=mij)
return suma(nod<<1, st, mij, sti, dri);
if(sti>mij)
return suma(nod*2+1, mij+1, dr, sti, dri);
return suma(nod<<1, st, mij, sti, mij) + suma(nod*2+1, mij+1, dr, mij+1, dri);
}
//--------------------------------------------
//functie de actualizat arborele (recursiva)
void scade(long nod, long st, long dr, long t, long v)
{
long mij;
arbore[nod] -= v;
if(st!=dr)
{
mij = (st+dr) >> 1;
if(t<=mij)
scade(nod<<1, st, mij, t, v);
else
scade(nod*2+1, mij+1, dr, t, v);
}
}
//--------------------------------------------