树状数组(Binary Indexed Tree/Fenwick Tree)

#include <cstdio>
#include <algorithm>

const int MAXN = 100005;

struct BIT {
    int n;
    long long a[MAXN];

    static constexpr int lowbit(int x) { return x & -x; }

    void init(int n) {
        this->n = n;
        std::fill(a + 1, a + n + 1, 0);
    }

    void update(int pos, int val) {
        for (int i = pos; i <= n; i += lowbit(i)) a[i] += val;
    }

    long long query(int pos) {
        long long res = 0;
        for (int i = pos; i; i -= lowbit(i)) res += a[i];
        return res;
    }
    long long query(int l, int r) { return query(r) - query(l - 1); }
} bit;

int main() {
    int n;
    scanf("%d", &n);

    static int a[MAXN];
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);

    bit.init(n);
    for (int i = 1; i <= n; i++) bit.update(i, a[i]);

    int q;
    scanf("%d", &q);
    while (q--) {
        int op;
        scanf("%d", &op);

        if (op == 1) {
            int pos, val;
            scanf("%d %d", &pos, &val);
            bit.update(pos, val);
        } else {
            int l, r;
            scanf("%d %d", &l, &r);
            printf("%lld\n", bit.query(l, r));
        }
    }

    return 0;
}

results matching ""

    No results matching ""