#include <bits/stdc++.h>
using namespace std;
long long n, q;
const int MAXN = 1e5 + 5;
long long segTree[4 * MAXN]; // Mảng cây phân đoạn
int A[MAXN];
void build(int node, int start, int end) {
if (start == end) {
segTree[node] = A[start]; // Gán giá trị từ mảng gốc
} else {
int mid = (start + end) / 2;
build(2 * node, start, mid);
build(2 * node + 1, mid + 1, end);
segTree[node] = segTree[2 * node] + segTree[2 * node + 1]; // Gộp tổng
}
}
// Cập nhật A[idx] += value
void update(int node, int start, int end, int idx, int value) {
if (start == end) {
segTree[node] += value;
} else {
int mid = (start + end) / 2;
if (idx <= mid) {
update(2 * node, start, mid, idx, value);
} else {
update(2 * node + 1, mid + 1, end, idx, value);
}
segTree[node] = segTree[2 * node] + segTree[2 * node + 1];
}
}
// Truy vấn tổng từ L đến R
long long query(int node, int start, int end, int L, int R) {
if (R < start || end < L) return 0; // Ngoài khoảng truy vấn
if (L <= start && end <= R) return segTree[node]; // Hoàn toàn nằm trong khoảng
int mid = (start + end) / 2;
long long leftSum = query(2 * node, start, mid, L, R);
long long rightSum = query(2 * node + 1, mid + 1, end, L, R);
return leftSum + rightSum;
}
int main() {
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> A[i];
}
build(1, 1, n); // Xây dựng cây phân đoạn
while (q--) {
int type, x, y;
cin >> type >> x >> y;
if (type == 1) {
update(1, 1, n, x, y); // Cập nhật A[x] += y
} else {
cout << query(1, 1, n, x, y) << "\n"; // Truy vấn tổng từ A[x] đến A[y]
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpsb25nIGxvbmcgbiwgcTsKCmNvbnN0IGludCBNQVhOID0gMWU1ICsgNTsKbG9uZyBsb25nIHNlZ1RyZWVbNCAqIE1BWE5dOyAvLyBN4bqjbmcgY8OieSBwaMOibiDEkW/huqFuCmludCBBW01BWE5dOyAKCnZvaWQgYnVpbGQoaW50IG5vZGUsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICAgIHNlZ1RyZWVbbm9kZV0gPSBBW3N0YXJ0XTsgLy8gR8OhbiBnacOhIHRy4buLIHThu6sgbeG6o25nIGfhu5FjCiAgICB9IGVsc2UgewogICAgICAgIGludCBtaWQgPSAoc3RhcnQgKyBlbmQpIC8gMjsKICAgICAgICBidWlsZCgyICogbm9kZSwgc3RhcnQsIG1pZCk7CiAgICAgICAgYnVpbGQoMiAqIG5vZGUgKyAxLCBtaWQgKyAxLCBlbmQpOwogICAgICAgIHNlZ1RyZWVbbm9kZV0gPSBzZWdUcmVlWzIgKiBub2RlXSArIHNlZ1RyZWVbMiAqIG5vZGUgKyAxXTsgLy8gR+G7mXAgdOG7lW5nCiAgICB9Cn0KCi8vIEPhuq1wIG5o4bqtdCBBW2lkeF0gKz0gdmFsdWUKdm9pZCB1cGRhdGUoaW50IG5vZGUsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGlkeCwgaW50IHZhbHVlKSB7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgICAgc2VnVHJlZVtub2RlXSArPSB2YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgICAgaW50IG1pZCA9IChzdGFydCArIGVuZCkgLyAyOwogICAgICAgIGlmIChpZHggPD0gbWlkKSB7CiAgICAgICAgICAgIHVwZGF0ZSgyICogbm9kZSwgc3RhcnQsIG1pZCwgaWR4LCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXBkYXRlKDIgKiBub2RlICsgMSwgbWlkICsgMSwgZW5kLCBpZHgsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgc2VnVHJlZVtub2RlXSA9IHNlZ1RyZWVbMiAqIG5vZGVdICsgc2VnVHJlZVsyICogbm9kZSArIDFdOwogICAgfQp9CgovLyBUcnV5IHbhuqVuIHThu5VuZyB04burIEwgxJHhur9uIFIKbG9uZyBsb25nIHF1ZXJ5KGludCBub2RlLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBMLCBpbnQgUikgewogICAgaWYgKFIgPCBzdGFydCB8fCBlbmQgPCBMKSByZXR1cm4gMDsgLy8gTmdvw6BpIGtob+G6o25nIHRydXkgduG6pW4KICAgIGlmIChMIDw9IHN0YXJ0ICYmIGVuZCA8PSBSKSByZXR1cm4gc2VnVHJlZVtub2RlXTsgLy8gSG/DoG4gdG/DoG4gbuG6sW0gdHJvbmcga2hv4bqjbmcKICAgIAogICAgaW50IG1pZCA9IChzdGFydCArIGVuZCkgLyAyOwogICAgbG9uZyBsb25nIGxlZnRTdW0gPSBxdWVyeSgyICogbm9kZSwgc3RhcnQsIG1pZCwgTCwgUik7CiAgICBsb25nIGxvbmcgcmlnaHRTdW0gPSBxdWVyeSgyICogbm9kZSArIDEsIG1pZCArIDEsIGVuZCwgTCwgUik7CiAgICByZXR1cm4gbGVmdFN1bSArIHJpZ2h0U3VtOwp9CgppbnQgbWFpbigpIHsKICAgIGNpbiA+PiBuID4+IHE7CiAgICAKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGNpbiA+PiBBW2ldOwogICAgfQogICAgCiAgICBidWlsZCgxLCAxLCBuKTsgLy8gWMOieSBk4buxbmcgY8OieSBwaMOibiDEkW/huqFuCgogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGludCB0eXBlLCB4LCB5OwogICAgICAgIGNpbiA+PiB0eXBlID4+IHggPj4geTsKICAgICAgICBpZiAodHlwZSA9PSAxKSB7CiAgICAgICAgICAgIHVwZGF0ZSgxLCAxLCBuLCB4LCB5KTsgLy8gQ+G6rXAgbmjhuq10IEFbeF0gKz0geQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvdXQgPDwgcXVlcnkoMSwgMSwgbiwgeCwgeSkgPDwgIlxuIjsgLy8gVHJ1eSB24bqlbiB04buVbmcgdOG7qyBBW3hdIMSR4bq/biBBW3ldCiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0=