#include <stdio.h>
const int MAXN = 1e5;
int v[MAXN + 1];
int aint[2 * MAXN + 1];
void build(int left, int right, int node) {
int mid, leftSon, rightSon;
if (left == right) {
aint[node] = v[left];
return;
}
mid = (left + right) / 2;
leftSon = node + 1;
rightSon = node + 2 * (mid - left + 1);
build(left, mid, leftSon);
build(mid + 1, right, rightSon);
aint[node] = aint[leftSon] + aint[rightSon];
}
void update(int left, int right, int node, int x, int val) {
int mid;
if (left == right) {
aint[node] -= val;
return;
}
mid = (left + right) / 2;
if (x <= mid)
update(left, mid, node + 1, x, val);
else
update(mid + 1, right, node + 2 * (mid - left + 1), x, val);
aint[node] = aint[node + 1] + aint[node + 2 * (mid - left + 1)];
}
int query(int left, int right, int node, int qleft, int qright) {
int mid;
if (qright < left || qleft > right) {
return 0;
}
if (left >= qleft && right <= qright) {
return aint[node];
}
mid = (left + right) / 2;
int s1 = 0, s2 = 0;
if (qleft <= mid)
s1 = query(left, mid, node + 1, qleft, qright);
if(mid < qright)
s2 = query(mid + 1, right, node + 2 * (mid - left + 1), qleft, qright);
return s1 + s2;
}
int main() {
FILE *fin, *fout;
int n, m, op, a, b, i;
fin = fopen( "datorii.in", "r" );
fout = fopen( "datorii.out", "w" );
fscanf( fin, "%d%d", &n, &m );
for (i = 1; i <= n; i++)
fscanf(fin, "%d", &v[i]);
build(1, n, 1);
for (i = 0; i < m; i++) {
fscanf(fin, "%d%d%d", &op, &a, &b);
if (op == 1)
fprintf(fout, "%d\n", query(1, n, 1, a, b));
else
update(1, n, 1, a, b);
}
fclose(fin);
fclose(fout);
return 0;
}