#include <iostream>
#include <fstream>
std::ifstream fin("datorii.in");
std::ofstream fout("datorii.out");
const int max = 15001;
int tree[max * 4], array[max];
void build(int node, int left, int right) {
if (left == right)
tree[node] = array[left];
else {
int mid = (left + right) / 2;
build(2 * node, left, mid);
build(2 * node + 1, mid + 1, right);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
}
void update(int node, int left, int right, int pos, int newValue) {
if (left == right)
tree[node] -= newValue;
else {
int mid = (left + right) / 2;
if (pos <= mid) {
update(2 * node, left, mid, pos, newValue);
}
else
update(2 * node + 1, mid + 1, right, pos, newValue);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
}
int query(int node, int left, int right, int ql, int qr) {
if(ql <= left && right <= qr) {
return tree[node];
}
else {
int mid = (left + right) / 2;
if (mid >= qr)
return query(2 * node, left, mid, ql, qr);
if (mid + 1 <= ql)
return query(2 * node + 1, mid + 1, right, ql, qr);
return query(2 * node, left, mid, ql, qr) + query(node * 2 + 1, mid + 1, right, ql, qr);
}
}
int main()
{
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> array[i];
}
build(1, 1, n);
int a, b, c;
for (int i = 1; i <= m; i++) {
fin >> a >> b >> c;
if (a == 1) {
fout << query(1, 1, n, b, c) << '\n';
}
else {
update(1, 1, n, b, c);
}
}
return 0;
}