#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
struct tripla {
int op, x, y;
};
int n, m;
tripla Q[100001];
int a[15001], seg[15000 * 4];
void read() {
int op, x, y;
ifstream f("datorii.in");
f >> n >> m;
int i;
for (i = 1; i <= n; i++)
f >> a[i];
for (i = 1; i <= m; i++) {
f >> op >> x >> y;
Q[i].op = op;
Q[i].x = x;
Q[i].y = y;
}
f.close();
}
void buildTree(int ind, int st, int dr) {
if (st == dr) {
seg[ind] = a[st];
return;
}
int mij = (st + dr) / 2;
buildTree(ind * 2, st, mij);
buildTree(ind * 2 + 1, mij + 1, dr);
seg[ind] = seg[ind * 2] + seg[ind * 2 + 1];
}
int query(int ind, int st, int dr, int qst, int qdr) {
if (dr < qst || st > qdr)
return 0;
else if (st >= qst && dr <= qdr)
return seg[ind];
int mij = (st + dr) / 2, s, d;
s = query(ind * 2, st, mij, qst, qdr);
d = query(ind * 2 + 1, mij + 1, dr, qst, qdr);
return s + d;
}
void update(int ind, int st, int dr, int poz, int val) {
if (st == dr) {
seg[ind] -= val;
return ;
}
int mij = (st + dr) / 2;
if (mij >= poz)
update(ind * 2, st, mij, poz, val);
else update(ind * 2 + 1, mij + 1, dr, poz, val);
seg[ind] = seg[ind * 2] + seg[ind * 2 + 1];
}
void solve() {
buildTree(1, 1, n);
}
void output() {
ofstream g("datorii.out");
int i;
for (i = 1; i <= m; i++) {
if (Q[i].op == 1)
g << query(1, 1, n, Q[i].x, Q[i].y) << '\n';
else
update(1, 1, n, Q[i].x, Q[i].y);
}
g.close();
}
int main() {
read();
solve();
output();
return 0;
}