#include <stdio.h>
#define MAXN 15000
int tree[65536];
int A[16384];
void build_tree(int start_range, int end_range, int pos) {
if (start_range == end_range) {
tree[pos] = A[start_range];
return;
}
int mid_range = (start_range + end_range) / 2;
int left_child = pos * 2, right_child = pos * 2 + 1;
build_tree(start_range, mid_range, left_child);
build_tree(mid_range + 1, end_range, right_child);
tree[pos] = tree[left_child] + tree[right_child];
}
void update_tree(int start_range, int end_range, int day, int ammount, int pos) {
tree[pos] -= ammount;
if (start_range == end_range)
return;
int mid_range = (start_range + end_range) / 2;
int left_child = pos * 2, right_child = pos * 2 + 1;
if (day <= mid_range)
update_tree(start_range, mid_range, day, ammount, left_child);
else
update_tree(mid_range + 1, end_range, day, ammount, right_child);
}
int compute_number(int start_range, int end_range, int st, int en, int pos) {
if (st == start_range && en == end_range)
return tree[pos];
int mid_range = (start_range + end_range) / 2;
int left_child = pos * 2, right_child = pos * 2 + 1;
if (en <= mid_range)
return compute_number(start_range, mid_range, st, en, left_child);
if (st > mid_range)
return compute_number(mid_range + 1, end_range, st, en, right_child);
return
compute_number(start_range, mid_range, st, mid_range, left_child) +
compute_number(mid_range + 1, end_range, mid_range + 1, en, right_child);
}
int main() {
FILE *f;
int n ,m;
f = fopen("datorii.in", "rt");
fscanf(f, "%d %d", &n, &m);
for (int i = 0; i < n; ++i)
fscanf(f, "%d", A + i);
build_tree(0, n, 1);
freopen("datorii.out", "wt", stdout);
for (int i = 0; i < m; ++i) {
int a, b, c;
fscanf(f, "%d %d %d", &a, &b, &c);
if (a)
printf("%d\n", compute_number(0, n, b - 1, c - 1, 1));
else
update_tree(0, n, b - 1, c, 1);
}
return 0;
}