#include <iostream>
#include <vector>
#include <fstream>
template <typename T, T (*REDUCTION)(const T&, const T&)>
class Segtree {
public:
int n;
int query_update = 1;
int start_from = 1;
bool closed_interval = true;
std::vector<T> segtree;
Segtree(int _n) : n(_n) {
segtree.reserve(4 * n + 1);
query_update = 1;
start_from = 1;
closed_interval = true;
}
Segtree(int _n, int _q) : n(_n), query_update(_q) {
segtree.reserve(4 * n + 1);
}
Segtree(int _n, int _q, int ci, int sf = 1) : n(_n), query_update(_q), closed_interval(ci), start_from(sf) {
segtree.reserve(4 * n + 1);
}
int parent(int& n) {
return n / 2;
}
int child_left(int& n) const {
return 2 * n;
}
int child_right(int& n) const {
return 2 * n + 1;
}
// interval a, b starting from node(l, r)
void update(int a, int b, int l, int r, int node, T s) {
int mid = l + (r - l) / 2;
if (l == r) {
segtree[node] = segtree[node] + s;
return;
}
if (a <= mid)
update(a, b, l, mid, child_left(node), s);
if (b > mid)
update(a, b, mid + 1, r, child_right(node), s);
segtree[node] = REDUCTION(segtree[child_left(node)], segtree[child_right(node)]);
}
int query(int a, int b, int l, int r, int node) {
int mid = l + (r - l) / 2;
if (a <= l && r <= b)
return segtree[node];
int x = 0;
if (a <= mid)
x = REDUCTION(x, query(a, b, l, mid, child_left(node)));
if (b > mid)
x = REDUCTION(x, query(a, b, mid + 1, r, child_right(node)));
return x;
}
void update(int a, int b, T s) {
update(a+ (1 - start_from), b+ (1 - start_from) - (closed_interval ? 0:1), 1, n, 1, s);
}
int query(int a, int b) {
return query(a+ (1 - start_from), b+ (1 - start_from) - (closed_interval ? 0:1), 1, n, 1);
}
int query(std::istream &inp = std::cin, std::ostream &outp = std::cout) {
int q, a;
T b;
inp >> q >> a >> b;
if (q == query_update) {
if (closed_interval)
update(a , a, -b);
else
update(a, a+1, -b);
} else {
outp << query(a, closed_interval ? b : (b-1))<<"\n";
}
return 0;
}
void build(int l, int r, int nod, std::istream &inp = std::cin) {
if (l == r) {
inp >> segtree[nod];
}
else {
int mid = l + (r - l) / 2;
build(l, mid, child_left(nod), inp);
build(mid + 1, r, child_right(nod), inp);
segtree[nod] = REDUCTION(segtree[child_left(nod)], segtree[child_right(nod)]);
}
}
void build(std::istream &inp = std::cin) {
build(1, n, 1, inp);
}
};
template <typename T>
T sum(const T& a, const T& b) {
return a + b;
}
std::ifstream f("datorii.in");
std::ofstream g("datorii.out");
int main() {
int n, m;
f >> n >> m;
Segtree<unsigned long long, sum<unsigned long long> > s(n, 0);
s.build(f);
for (int i = 0 ; i < m; ++i) {
s.query(f, g);
}
}