#include <iostream>
#include <fstream>
using namespace std;
const int MAX_N = 15001, MAX_LEN = 300020;
int N, M;
int v[MAX_N]; //datoriile initiale
int tree[MAX_LEN]; //arbore de intervale
int sum; //variabila in care retin
void build_tree(int start, int end, int node) {
if (start == end) {
tree[node] = v[start];
} else {
int midd = start + (end - start) / 2;
build_tree(start, midd, 2 * node);
build_tree(midd + 1, end, 2 * node + 1);
tree[node] = tree[2 * node] + tree[2 * node + 1];
}
}
void update_query(int start, int end, int node, int day, int value) {
if (start == end) {
tree[node] -= value;
} else {
int midd = start + (end - start) / 2;
if (day <= midd) update_query(start, midd, 2 * node, day, value);
else update_query(midd + 1, end, 2 * node + 1, day, value);
tree[node] -= value;
}
}
void sum_query(int start, int end, int node, int f_day, int l_day) {
if (f_day <= start && end <= l_day) {
sum += tree[node];
} else {
int midd = start + (end - start) / 2;
if (f_day <= midd) sum_query(start, midd, 2 * node, f_day, l_day);
if (l_day > midd) sum_query(midd + 1, end, 2 * node + 1, f_day, l_day);
}
}
int main() {
ifstream fin("datorii.in");
ofstream fout("datorii.out");
fin >> N >> M;
for (int i = 1; i <= N; i++) {
fin >> v[i];
}
build_tree(1, N, 1);
int type, x, y;
for (int i = 1; i <= M; i++) {
fin >> type >> x >> y;
if (type == 0) {
update_query(1, N, 1, x, y);
} else {
sum = 0;
sum_query(1, N, 1, x, y);
fout << sum << '\n';
}
}
fin.close();
fout.close();
return 0;
}