#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
void build_tree(std::vector<int>& a, std::vector<int>& values, int index, int int_left, int int_right) {
if (int_left == int_right) {
a[index - 1] = values[int_left];
return;
}
int mid = (int_left + int_right) / 2;
build_tree(a, values, 2 * index, int_left, mid);
build_tree(a, values, 2 * index + 1, mid + 1, int_right);
a[index - 1] = a[2 * index] + a[2 * index - 1];
}
void update_payments(std::vector<int>& a, int tree_pos, int index, int int_left, int int_right, int amount) {
if (int_left == int_right) {
a[tree_pos - 1] -= amount;
return;
}
int mid = (int_left + int_right) / 2;
if (index <= mid) {
update_payments(a, tree_pos * 2, index, int_left, mid, amount);
}
else {
update_payments(a, tree_pos * 2 + 1, index, mid + 1, int_right, amount);
}
a[tree_pos - 1] = a[tree_pos * 2] + a[tree_pos * 2 - 1];
}
int sum(std::vector<int>& a, int tree_pos, int int_left, int int_right, int start_date, int end_date) {
if (start_date == int_left && end_date == int_right) {
return a[tree_pos - 1];
}
int mid = (int_left + int_right) / 2;
if (end_date <= mid) {
return sum(a, tree_pos * 2, int_left, mid, start_date, end_date);
}
else if (start_date > mid) {
return sum(a, tree_pos * 2 + 1, mid + 1, int_right, start_date, end_date);
}
return sum(a, tree_pos * 2, int_left, mid, start_date, mid) +
sum(a, tree_pos * 2 + 1, mid + 1, int_right, mid + 1, end_date);
}
int main()
{
std::ifstream f("datorii.in");
std::ofstream g("datorii.out");
int n;
long m;
f >> n >> m;
std::vector<int> v(n, 0), a(100000, 0);
for (int i = 0; i < n; i++)
f >> v[i];
build_tree(a, v, 1, 0, n - 1);
int op, t, q;
for (long i = 0; i < m; i++) {
f >> op >> t >> q;
if (!op) {
update_payments(a, 1, t - 1, 0, n - 1, q);
}
else {
g << sum(a, 1, 0, n - 1, t - 1, q - 1) << "\n";
}
}
}