#include <bits/stdc++.h>
using namespace std;
const string fileName("datorii");
ifstream fin(fileName + ".in");
ofstream fout(fileName + ".out");
///-------------------------
constexpr int NMAX = 15e3 + 3;
int n, m, arr[NMAX], itree[NMAX * 4];
void getSons(int node, int &leftSon, int &rightSon) {
leftSon = node * 2;
rightSon = leftSon + 1;
}
void buildITree(int node, int left, int right) {
if (left > right) {
return;
}
if (left == right) {
itree[node] = arr[left];
return;
}
int mid = (left + right) / 2;
int leftSon, rightSon;
getSons(node, leftSon, rightSon);
buildITree(leftSon, left, mid);
buildITree(rightSon, mid + 1, right);
itree[node] = itree[leftSon] + itree[rightSon];
}
int query(int node, int left, int right, int qleft, int qright) {
if (left == qleft && right == qright) {
return itree[node];
}
int mid = (left + right) / 2;
int leftSon, rightSon;
getSons(node, leftSon, rightSon);
if (qright <= mid) {
return query(leftSon, left, mid, qleft, qright);
}
if (qleft > mid) {
return query(rightSon, mid + 1, right, qleft, qright);
}
return query(leftSon, left, mid, qleft, mid) + query(rightSon, mid + 1, right, mid + 1, qright);
}
int pos, value;
void update(int node, int left, int right) {
if (left == right) {
itree[node] = value;
return;
}
int mid = (left + right) / 2;
int leftSon, rightSon;
getSons(node, leftSon, rightSon);
if (pos <= mid) {
update(leftSon, left, mid);
} else {
update(rightSon, mid + 1, right);
}
itree[node] = itree[leftSon] + itree[rightSon];
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> arr[i];
}
buildITree(1, 1, n);
int a, b;
bool op;
while (m--) {
fin >> op >> a >> b;
if (!op) {
int delta = query(1, 1, n, a, a) - b;
pos = a, value = delta;
update(1, 1, n);
} else {
fout << query(1, 1, n, a, b) << endl;
}
}
fout.close();
return 0;
}