#include <fstream>
int arb[400001], n, m;
void pune_val(int nod, int st, int dr, int pozitie, int val) {
if(pozitie > dr || pozitie < st) return;
if(st == pozitie && st == dr) { // cand ajung pe frunza pun val, respectiiv scad val cand se apeleaza cu val negativ
arb[nod] += val;
return;
}
//
int mijloc_interval = (st+dr) >> 1;
if (pozitie <= mijloc_interval) {
pune_val(nod << 1, st, mijloc_interval,pozitie,val); // merg pe intervalul din st == pe fiul st in arbore care se afla la nod//2
}
else {
pune_val((nod << 1)+1, mijloc_interval+1, dr, pozitie, val); // merg pe intervalul din dr == pe fiul dr in arbore care se afla la nod//2 + 1
}
arb[nod] = arb[nod << 1] + arb[(nod << 1) + 1];
}
int suma_interval(int nod, int st, int dr, int inceput, int sfarsit) {
if(inceput > dr || sfarsit < st) return 0;
if(inceput <= st && sfarsit >= dr) { //daca intervalul meu include complet un interval din arbore
return arb[nod];
}
else {
int mijloc_interval = (st+dr) >> 1 ;
return suma_interval(nod << 1, st,mijloc_interval,inceput,sfarsit) + suma_interval((nod << 1)+1, mijloc_interval+1, dr, inceput, sfarsit);
}
}
int main()
{
std::fstream fileIn("datorii.in");
std::ofstream fileOut("datorii.out");
fileIn >> n >> m;
int x;
for(int i = 1; i <= n; ++i) {
fileIn >> x;
pune_val(1,1,n,i,x);
// pune valoarea x pe pozitia i = acum construiesc arborele si updatez suma de intervale
}
int op,a,b;
for( int i = 0; i < m; ++i) {
fileIn >> op >> a >> b;
if(!op) {
// se achita suma b pt ziua a
pune_val(1,1,n,a,-b);
}
else {
//suma din interval a,b
fileOut << suma_interval(1,1,n,a,b) << '\n';
}
}
return 0;
}