#include <iostream>
#include <fstream>
using namespace std;
ifstream finput ("datorii.in");
ofstream foutput("datorii.out");
// se asemana tare mult cu probl arb_int
int arb_int[70100], valori[25005];
void arbore_compunere(int nod , int left, int right) {
if (left == right)
arb_int[nod] = valori[left];
else {//completam arborele pe partea stanga atunci cand nu sunt pe cazul de capete egale// moment in care am epuizat cazurile pe acel nod
int mij = (left + right) >> 1;
arbore_compunere((nod << 1), left, mij);
arbore_compunere(-(~(nod << 1)), mij + 1, right);
// -(~(nod<<1)) = n/2 +1
arb_int[nod] = arb_int[nod<<1]+arb_int[(nod<<1)+1];
}
}
void update(int nod, int left, int right, int i, int suma)
{
if(i < left || i > right)
return;
if(left == right)
{
arb_int[nod] -= suma;
return;
}
int mij = (left+right)>>1;
if(i <= mij)
update(nod<<1, left, mij, i, suma);
else
update(((nod<<1) + 1), mij + 1, right, i, suma);
arb_int[nod] = arb_int[nod<<1] + arb_int[(nod<<1) +1];
}
int query(int nod, int left, int right, int i, int j)
{
if(right < i || left > j)
return 0;
if(i <= left && j >= right)
return arb_int[nod];
int mij = (left+right)>>1;
// acumulez aici sumele restante
return query(nod<<1, left, mij, i, j) + query((nod<<1) + 1, mij+1, right, i, j);
}
int main()
{
int n, m, i, op, x, pos;
finput>>n>>m;
for(i = 1; i <= n; ++i)
finput>>valori[i];
arbore_compunere(1, 1, n);
// atata timp cat are sens sa fac o operatie, deci ea exista
while(m)
{
finput>>op>>pos>>x;
//Un cod 0 urmat de doua numere intregi T, V (1 ≤ T ≤ N, 1 ≤ V ≤ 1000)
// reprezinta o operatie de tip A (in momentul respectiv s-a achitat o valoare V
// din suma restanta a zilei T)
if(op == 0)
update(1, 1, n, pos, x);
//Un cod 1 urmat de doua numere intregi P, Q (1 ≤ P ≤ Q ≤ N)
// o operatie de tip B (se cere suma tuturor sumelor restante din zilele P, P+1, P+2... Q
// in momentul respectiv).
if(op == 1)
foutput<<query(1, 1, n, pos, x)<<'\n';
--m;
}
return 0;
}