#include<fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n, i, v[100001], m;
int op, poz, nr;
int arb[400001];
///datoriile zilnice vor fi in nodurile frunza
///in radacina va fi datoria pe toate zilele
//1+2+3+4+5+6
//1+2+3 4+5+6
//1+2 3 4+5 6
//1 2 4 5
///in fiecare subarbore datoriile in zilele din prima jum
void build(int poz, int st, int dr)
{
if(st == dr)/// am ajuns la o frunza
{
arb[poz] = v[st];
}
else
{
int mid = (st + dr)/2;
build(poz * 2, st, mid);
build(poz * 2 + 1, mid + 1,dr);
arb[poz] = arb[2 * poz] + arb[2 * poz + 1];///radacina va fi suma celor 2 subarbori
}
}
void update(int poz, int nr, int st, int dr, int p)
{
if(st == dr) ///am ajuns la ziua respectiva
{
arb[poz]-=nr;
return;
}
int mid = (st + dr)/2;
if(p <= mid) ///vedem in care subarbore se afla
update(poz*2 ,nr, st, mid, p); ///modific si sumele care contin ziua respectiva
else
update(poz * 2 + 1, nr, mid + 1, dr, p);
arb[poz] -= nr;
}
int query(int qst, int qdr, int st, int dr, int poz) ///qst qdr intervalul de zile cautat
{
/// initial poz = 1 --> radacina --> stim ca aceasta memoreaza datoriile din zilele 1->n
/// facem cele 2 jum, dar dupa o jum de va interesa partial
if(st >= qst && dr <= qdr)
return arb[poz];
if(st > qdr)
return 0;
if(dr < qst)
return 0;
int mid = (st+dr)/2;
int a,b;
a = query(qst, qdr, st, mid, poz*2); ///cautam cea mai mare radacina care contine un interval complet de zile
b = query(qst, qdr, mid+1, dr, poz*2+1);
return a + b;
}
int main()
{
fin >> n >> m;
for(i = 1; i <= n; i++)
fin >> v[i];
build(1,1,n);
for(i = 1; i <= m; i++)
{
fin >> op >> poz >> nr;
if(op == 0)
update(1, nr, 1, n, poz);
else
fout << query(poz, nr, 1, n, 1)<<"\n";
}
}