#include <stdio.h>
#include <vector>
#define N 15000
struct Node {
int sum = 0;
Node() {
sum = 0;
}
Node(int s) {
sum = s;
}
};
Node add(Node a, Node b) {
return Node(a.sum + b.sum);
}
struct SegTree {
int leaf_offset;
std::vector <Node> aint;
SegTree(int n) {
leaf_offset = 1;
while ( leaf_offset <= n )
leaf_offset *= 2;
aint.resize(leaf_offset * 2);
}
inline int get_left_son(int n) { return n * 2; }
inline int get_right_son(int n) { return n * 2 + 1; }
void _update(int val, int pos) {
pos += leaf_offset;
aint[pos].sum -= val;
while ( pos > 1 ) {
pos /= 2;
aint[pos] = add(aint[pos * 2], aint[pos * 2 + 1]);
}
}
inline void update(int val, int pos) {
_update(val, pos);
}
Node _query(int node, int left, int right, int qleft, int qright) {
if ( right < qleft || left > qright )
return Node{};
if ( qleft <= left && right <= qright )
return aint[node];
int middle = (left + right) / 2;
Node left_son = _query(get_left_son(node), left, middle, qleft, qright);
Node right_son = _query(get_right_son(node), middle + 1, right, qleft, qright);
return add(left_son, right_son);
}
inline int query(int left, int right) {
return _query(1, 0, leaf_offset - 1, left, right).sum;
}
void init(int n, int v[]) {
for ( int i = 0; i < n; i ++ ) {
update(-v[i], i);
}
}
};
int v[N];
int main() {
FILE *fin, *fout;
int q, x, y, n, nq;
fin = fopen("datorii.in", "r");
fout = fopen("datorii.out", "w");
fscanf(fin, "%d%d", &n, &nq);
SegTree segtree(n);
for ( int i = 0; i < n; i ++ )
fscanf(fin, "%d", &v[i]);
segtree.init(n, v);
for ( int i = 0; i < nq; i ++ ) {
fscanf(fin, "%d%d%d", &q, &x, &y);
if ( q == 0 ) {
segtree.update(y, x - 1);
printf("update -%d at %d\n", y, x - 1);
for ( int j = 0; j < n; j ++ )
printf("%d ", segtree.query(j, j));
printf("\n");
}
else
fprintf(fout, "%d\n", segtree.query(x - 1, y - 1));
}
fclose(fin);
fclose(fout);
return 0;
}