// Arbori intervale
#include <stdio.h>
#define MAX_N 15000
#define UPDATE 0
#define QUERY 1
int v[MAX_N];
int aint[MAX_N * 2];
void build(int node, int nLeft, int nRight) {
if (nLeft == nRight) {
aint[node] = v[nLeft];
return;
}
int nMid, leftSon, rightSon;
nMid = (nLeft + nRight) / 2;
leftSon = node + 1;
rightSon = node + 2 * (nMid - nLeft + 1);
build(leftSon, nLeft, nMid);
build(rightSon, nMid + 1, nRight);
aint[node] = aint[leftSon] + aint[rightSon];
}
void update(int node, int nLeft, int nRight, int pos, int value) {
if (nLeft == nRight) {
aint[node] = value;
return;
}
int nMid, leftSon, rightSon;
nMid = (nLeft + nRight) / 2;
leftSon = node + 1;
rightSon = node + 2 * (nMid - nLeft + 1);
if (pos <= nMid)
update(leftSon, nLeft, nMid, pos, value);
else
update(rightSon, nMid + 1, nRight, pos, value);
aint[node] = aint[leftSon] + aint[rightSon];
}
int query(int node, int nLeft, int nRight, int qLeft, int qRight) {
if (qLeft <= nLeft && qRight >= nRight)
return aint[node];
int nMid, leftSon, rightSon;
int result;
nMid = (nLeft + nRight) / 2;
leftSon = node + 1;
rightSon = node + 2 * (nMid - nLeft + 1);
result = 0;
if (qLeft <= nMid)
result += query(leftSon, nLeft, nMid, qLeft, qRight);
if (nMid < qRight)
result += query(rightSon, nMid + 1, nRight, qLeft, qRight);
return result;
}
int main() {
FILE *fin, *fout;
fin = fopen("datorii.in", "r");
fout = fopen("datorii.out", "w");
int n, m, i, type, a, b;
fscanf(fin, "%d%d", &n, &m);
for (i = 0; i < n; ++i)
fscanf(fin, "%d", &v[i]);
build(0, 0, n - 1);
while (m--) {
fscanf(fin, "%d%d%d", &type, &a, &b);
if (type == UPDATE) {
v[a - 1] -= b;
update(0, 0, n - 1, a - 1, v[a - 1]);
} else if (type == QUERY)
fprintf(fout, "%d\n", query(0, 0, n - 1, a - 1, b - 1));
}
fclose(fin);
fclose(fout);
return 0;
}