#include<iostream>
#include<vector>
#include<fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
vector<int> arb, arr;
int n, m;
void buildTree(int left, int right, int ind) {
if (left == right) {
arb[ind] = arr[left];
return ;
}
int mid = left + (right - left) / 2;
buildTree(left, mid, 2 * ind);
buildTree(mid + 1, right, 2 * ind + 1);
arb[ind] = arb[2 * ind] + arb[2 * ind + 1];
}
void update(int index, int val, int left, int right, int ind) {
if (left == right) {
arb[ind] -= val;
return;
}
int mid = left + (right - left) / 2;
if (index <= mid)
update(index, val, left, mid, 2 * ind);
else
update(index, val, mid + 1, right, 2 * ind + 1);
arb[ind] = arb[2 * ind] + arb[2 * ind + 1];
}
int getSize()
{
int size = 1;
while (size < n)
size <<= 1;
return size << 1;
}
int query(int left, int right, int lo, int hi, int ind) {
if (left >= lo && right <= hi) {
return arb[ind];
}
int mid = left + (right - left) / 2;
int qleft = 0, qright = 0;
if (lo <= mid)
qleft = query(left, mid, lo, hi, 2 * ind);
if (hi > mid)
qright = query(mid + 1, right, lo, hi, 2 * ind + 1);
return qleft + qright;
}
int main()
{
fin >> n >> m;
arr.resize(n);
arb.resize(getSize());
for (int i = 0; i < n; i++) {
fin >> arr[i];
}
buildTree(0, n-1, 1);
for (int i = 0; i < m; i++) {
int type, a, b;
fin >> type >> a >> b;
if (type) {
fout << query(0, n - 1, a - 1, b - 1, 1) << '\n';
} else {
update(a - 1, b, 0, n - 1, 1);
}
}
}