#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define FOR(i, a, b) for (int i = (a), i##_len = (b); i < i##_len; i++)
#define ALL(x) (x).begin(), (x).end()  // sortなどの引数を省略したい
#ifdef _DEBUG
#define PRE_COMMAND             \
    std::cin.rdbuf(in.rdbuf()); \
    std::cout << fixed << setprecision(15);
#else
#define PRE_COMMAND cout << fixed << setprecision(15);
#endif
const double EPS = 1e-10, PI = acos(-1.0);
template <class T> auto MAX(T& seq) {
    return *max_element(seq.begin(), seq.end());
}
template <class T> auto MIN(T& seq) {
    return *min_element(seq.begin(), seq.end());
}
template <class T> auto SUM(T& seq) {
    T temp{0};
    auto& temp2 = temp[0];
    return accumulate(seq.begin(), seq.end(), temp2);
}
template <class T> void SORT(T& seq) { sort(seq.begin(), seq.end()); }
template <class T, class S> void SORT(T& seq, S& sort_order) {
    sort(seq.begin(), seq.end(), sort_order);
}
template <class T> void SORTR(vector<T>& seq) {
    sort(seq.begin(), seq.end(), greater<T>());
}
template <class T, class S, class R> long long pow(T n_0, S k_0, R mod_0) {
    long long n = n_0, k = k_0, mod = mod_0, now = 1;
    while (true) {
        if (k & 1) { now = now * n % mod; }
        if ((k >>= 1) == 0) { return now; }
        n = (n * n) % mod;
    }
}
template <typename T> istream& operator>>(istream& is, vector<T>& vec) {
    for (T& x : vec) is >> x;
    return is;
}

// 一点更新・一点取得の加法BIT
template <class num_type> struct BIT {
    int n;
    vector<num_type> bit;
    num_type allsum;
    int maxbit = 1;
    BIT(int tmp) : n(tmp) {
        bit.assign(n + 1, 0);
        allsum = 0;
        while (maxbit * 2 <= n) { maxbit *= 2; }
    }

    // 初期化する
    void make_bit(auto& a) {
        for (int i = 0, sz = (int)a.size(); i < sz; i++) {
            auto v = a[i];
            auto idx = i + 1;
            allsum += v;
            while (idx < n + 1) {
                bit[idx] += v;
                idx += idx & (-idx);
            }
        }
    }

    // 位置idxに値vを足す
    void add(auto idx, auto v) {
        idx++;
        allsum += v;
        while (idx < n + 1) {
            bit[idx] += v;
            idx += idx & (-idx);
        }
    }

    // 位置0からidxまでの和(sum(bit[:idx]))を計算する
    num_type sum(auto idx) {
        num_type ret = bit[0];
        while (idx > 0) {
            ret += bit[idx];
            idx -= idx & (-idx);
        }
        return ret;
    }

    // 位置idx1からidx2までの和(sum(bit[idx1:idx2]))を計算する
    num_type sum_range(auto idx1, auto idx2) { return sum(idx2) - sum(idx1); }

    // 和がw以上となる最小のインデックスを求める
    int lowerbound(auto w) {
        if (w <= 0) { return 0; }
        int x = 0;
        int k = maxbit;
        while (k) {
            if (x + k <= n && bit[x + k] < w) {
                w -= bit[x + k];
                x += k;
            }
            k /= 2;
        }
        return x;
    }
};

int main() {
    PRE_COMMAND
    int n, q, t;
    ll u, v;
    cin >> n >> q;
    vl a(n);
    cin >> a;
    BIT<ll> bit(n);
    bit.make_bit(a);
    REP(i, q) {
        cin >> t >> u >> v;
        if (t == 0) bit.add(u, v);
        if (t == 1) cout << bit.sum_range(u, v) << endl;
    }
}


Measured memory_bytes: 12136