#include<bits/stdc++.h>
#define fil [[gnu::always_inline]] inline
#define up(i,l,r) for(long long i=(l),E##i=(r);i<=E##i;++i)
#define dn(i,r,l) for(long long i=(r),E##i=(l);i>=E##i;--i)
using namespace std; typedef long long ll;
constexpr ll MAXB = 710, N = 5 + 5e5 + 2 * MAXB;
ll n, B, C;
array<ll, N> a, m;
array<ll, MAXB> b, l, r;
fil ll ri();
fil void build(), add(ll, ll), query(ll, ll);
int main() {
ll q, t, x, y;
n = ri(); q = ri();
up (i, 1, n) a[i] = ri();
build();
while (q--) {
t = ri(); x = ri(); y = ri();
(t == 1) ? add(x, y) : query(x, y);
}
}
fil void build() {
B = ceil(sqrtl(n)); C = (n + B - 1) / B;
up (j, 1, C - 1) up (i, l[j] = r[j - 1] + 1, r[j] = j * B) {
m[i] = j;
b[j] += a[i];
}
up (i, l[C] = r[C-1]+1, r[C] = n) {
m[i] = C;
b[C] += a[i];
}
}
fil void add(ll i, ll x) {
a[i] += x;
b[m[i]] += x;
}
fil ll rget(ll x, ll y, ll ret = 0) {
up (i, x, y) ret += a[i];
return ret;
}
fil void query(ll x, ll y) {
if (m[x] == m[y]) return (void) printf("%lld\n", rget(x, y));
ll ret = rget(x, r[m[x]]) + rget(l[m[y]], y);
for (ll j = m[x] + 1; j < m[y]; ++j) ret += b[j];
printf("%lld\n", ret);
}
#define g (p==q?q=(p=b)+fread(b,1,sizeof b,stdin),c=*(p++):(c=*(p++)))
inline ll ri() {
static char b[1 << 20], *p = b, *q = b, c = 0;
static ll x; static bool s;
for (x = s = 0; '0' > c || c > '9'; g) if (c == '-') s = !s;
while ('0' <= c && c <= '9') x = (x << 3) + (x << 1) + (c ^ '0'), g;
return s ? -x : x;
}
#undef g