#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
#define MAXN 15005
int n, m;
vector<int> values;
class SegmentTree {
public:
vector<int> tree;
SegmentTree(const vector<int>& values) {
int size = log2(values.size());
size += (1 << size) < values.size();
size = 1 << size;
tree.resize(size * 2);
Build(values, 1, size, 1);
}
int Query(int qLf, int qRg, int lf, int rg, int node) {
if (lf >= qLf && rg <= qRg) {
return tree[node];
}
int mid = lf + (rg - lf) / 2;
int sum = 0;
if (mid >= qLf) {
sum += Query(qLf, qRg, lf, mid, LfSon(node));
}
if (mid < qRg) {
sum += Query(qLf, qRg, mid + 1, rg, RgSon(node));
}
return sum;
}
void Update(int val, int pos, int lf, int rg, int node) {
if (lf == rg) {
tree[node] = val;
return;
}
int mid = lf + (rg - lf) / 2;
if (mid >= pos) {
Update(val, pos, lf, mid, LfSon(node));
} else {
Update(val, pos, mid + 1, rg, RgSon(node));
}
tree[node] = tree[LfSon(node)] + tree[RgSon(node)];
}
private:
void Build(const vector<int>& values, int lf, int rg, int node) {
if (lf == rg) {
if (lf >= values.size()) {
return;
}
tree[node] = values[lf];
return;
}
int mid = lf + (rg - lf) / 2;
Build(values, lf, mid, LfSon(node));
Build(values, mid + 1, rg, RgSon(node));
tree[node] = tree[LfSon(node)] + tree[RgSon(node)];
}
int LfSon(int node) {
return node * 2;
}
int RgSon(int node) {
return node * 2 + 1;
}
}; // class SegmentTree
void ReadData() {
fin >> n >> m;
values.resize(n + 1);
for (int i = 1; i <= n; i++) {
fin >> values[i];
}
}
void Solve() {
SegmentTree segTree = SegmentTree(values);
int t, a, b;
for (int i = 0; i < m; i++) {
fin >> t >> a >> b;
if (t == 0) {
values[a] -= b;
segTree.Update(values[a], a, 1, values.size(), 1);
} else {
fout << segTree.Query(a, b, 1, values.size(), 1) << '\n';
}
}
}
int main() {
ReadData();
Solve();
return 0;
}