#include <bits/stdc++.h>
const int INF = 2147483647;
const int NINF = -2147483648;
const int Mod = 998244353;
const int N = 1e6 + 10;
typedef long long ll;
using namespace std;
int n, m;
int a[N];
struct Node {
int l, r;
int v;
int sum, add;
} tree[N << 2];
void pushup(int root) {
tree[root].v = tree[root << 1].v + tree[root << 1 | 1].v;
}
int pushdown(int root) {
// Do somesthing
}
void build(int root, int l, int r) {
tree[root].l = l;
tree[root].r = r;
if (l == r) {
tree[root].v = a[l];
return;
}
int mid = (l + r) >> 1;
build(root << 1, l, mid);
build(root << 1 | 1, mid + 1, r);
pushup(root);
} // Build tree
void upd(int root, int p, int v) {
int l = tree[root].l, r = tree[root].r;
if (l == r) {
tree[root].v += v;
return;
}
int mid = (l + r) >> 1;
if (p <= mid)
upd(root << 1, p, v);
if (p > mid)
upd(root << 1 | 1, p, v);
pushup(root);
} // up data
Node query(int root, int sp, int ep) {
int l = tree[root].l, r = tree[root].r;
if (l >= sp && r <= ep)
return tree[root];
int mid = (l + r) >> 1;
if (ep <= mid)
query(root << 1, sp, ep);
if (sp > mid)
query(root << 1 | 1, sp, ep);
auto L = query(root << 1, sp, ep);
auto R = query(root << 1 | 1, sp, ep);
Node res;
res.l = L.l;
res.r = L.r;
res.v = L.v + R.v;
return res;
} // query tree
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
build(1, 1, n);
while (m--) {
int op, l, r;
cin >> op >> l >> r;
if (op == 1)
upd(1, l, r);
else {
auto res = query(1, l, r);// query错了,但不知那错了
cout << res.v << '\n';
}
}
return 0;
}