#include <fstream>
#include <vector>
using namespace std;
vector<int> segment_tree, a;
void build(int node, int left, int right) {
if (left == right)
segment_tree[node] = a[left];
else {
int middle = (left + right) / 2;
build(2 * node, left, middle);
build(2 * node + 1, middle + 1, right);
segment_tree[node] = segment_tree[2 * node] + segment_tree[2 * node + 1];
}
}
void update(int node, int left, int right, int position, int value) {
if (left == right)
segment_tree[node] -= value;
else {
int middle = (left + right) / 2;
if (position <= middle)
update(2 * node, left, middle, position, value);
else
update(2 * node + 1, middle + 1, right, position, value);
segment_tree[node] = segment_tree[2 * node] + segment_tree[2 * node + 1];
}
}
int query(int node, int left, int right, int query_left, int query_right) {
if (query_left <= left && right <= query_right)
return segment_tree[node];
else {
int middle = (left + right) / 2;
if (query_right <= middle)
return query(2 * node, left, middle, query_left, query_right);
if (middle + 1 <= query_left)
return query(2 * node + 1, middle + 1, right, query_left, query_right);
return query(2 * node, left, middle, query_left, query_right) + query(2 * node + 1, middle + 1, right, query_left, query_right);
}
}
int main() {
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n, m;
fin >> n >> m;
a.resize(n + 1);
for (int i = 1; i <= n; ++i)
fin >> a[i];
segment_tree.resize(4 * n);
build(1, 1, n);
for (int i = 1; i <= m; ++i) {
int op;
fin >> op;
if (op == 0) {
int t, v;
fin >> t >> v;
update(1, 1, n, t, v);
}
else {
int p, q;
fin >> p >> q;
fout << query(1, 1, n, p, q) << '\n';
}
}
return 0;
}