#include <fstream>
using namespace std;
ifstream cin ("datorii.in");
ofstream cout ("datorii.out");
const int NMAX = 15000;
int v[NMAX + 1], aint[4 * NMAX + 1];
int n;
void build(int node, int l, int r) {
if (l > r)
return;
if (l == r) {
aint[node] = v[l];
return;
}
int mid = (l + r) / 2;
build(2 * node, l, mid);
build(2 * node + 1, mid + 1, r);
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
void update(int node, int l, int r, int poz, int val) {
if (l > r || poz < l || poz > r)
return;
if (l == r) {
aint[node] -= val;
return;
}
int mid = (l + r) / 2;
update(2 * node, l, mid, poz, val);
update(2 * node + 1, mid + 1, r, poz, val);
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
int query(int node, int l, int r, int ql, int qr) {
if (l > r || qr < l || ql > r) //nu e inclus deloc
return 0; //nu infl val
if (ql <= l && qr >= r) //e inclus total
return aint[node];
int mid = (l + r) / 2;
int sumst = query(2 * node, l, mid, ql, qr);
int sumdr = query(2 * node + 1, mid + 1, r, ql, qr);
return sumst + sumdr;
}
int main() {
int m, i, op, a, b;
cin >> n >> m;
for (i = 1; i <= n; i++)
cin >> v[i];
build(1, 1, n);
for (i = 1; i <= m; i++) {
cin >> op >> a >> b;
if (op == 1)
cout << query(1, 1, n, a, b) << '\n';
else
update(1, 1, n, a, b);
}
return 0;
}