#include <iostream>
#include <fstream>
using namespace std;
#define NMAX 501
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int fiuStanga(int nod) {
return 2 * nod + 1;
}
int fiuDreapta(int nod) {
return 2 * nod + 2;
}
void updateTree(int tree[], int stanga, int dreapta, int poz, int val, int nodCurent) {
if (stanga == dreapta) {
tree[nodCurent] += val;
return;
}
int mij = (stanga + dreapta) / 2;
if (poz <= mij) updateTree(tree, stanga, mij, poz, val, fiuStanga(nodCurent));
else updateTree(tree, mij + 1, dreapta, poz, val, fiuDreapta(nodCurent));
tree[nodCurent] += tree[fiuDreapta(nodCurent)] + tree[fiuStanga(nodCurent)];
}
int query(int tree[], int nodCurent, int st, int dr, int stNOU, int drNOU) {
//daca face overlap total returnez valoarea de pe nodul curent
if (stNOU <= st && drNOU >= dr)
return tree[nodCurent];
int mij = st + (dr - st) / 2;
//daca pozitia noua din stanga e mai mare decat mijlocul intervaluilui -> subtree dreapta
//else subtree left
int s1 = 0, s2 =0;
if (stNOU > mij) s1 = query(tree, fiuDreapta(nodCurent), mij + 1, dr, stNOU, drNOU);
else if (drNOU <= mij) s2 = query(tree, fiuStanga(nodCurent), st, mij, stNOU, drNOU);
return s1 + s2;
}
int main() {
int nrNumere, val, actiuni;
fin >> nrNumere >> actiuni;
int tree[4 * 15000];
for (int i = 1; i <= nrNumere; i++) {
fin >> val;
updateTree(tree, 1, nrNumere, i, val, 1); //creez tree-ul pe valorile initiale
}
int actiune, poz, st, dr;
for (int i = 0 ; i < actiuni ; i++)
{
fin >> actiune;
if(actiune == 0){
fin >> st >> dr;
fout << query(tree, 1, 1, nrNumere, st, dr) << '\n';
} else {
fin >> poz >> val;
updateTree(tree, 1, nrNumere, poz, val, 1);
}
}
}