使用树状数组实现单点更新+求区间和

题目大意:

给你一个长度为 \(n\) 的数组元素 \(a[1], a[2], \cdots, a[n]\)
接下来有 \(q\) 次操作,操作只有两种类型:

“1 p x” —— 更新操作:将 \(a[p]\) 更新为 \(x\)
“2 L R” —— 查询操作:求区间 \([L,R]\) 范围内所有数之和。

对于每一次查询操作,你需要求出区间 \([L,R]\) 范围内的所有数之和(即 \(a[L]+a[L+1]+ \cdots +a[R]\) 的和)。

树状数组实现代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int n, q, op, L, R, p;
long long x, a[maxn], sum[maxn];
int lowbit(int x) {
    return x & (-x);
}
void update(int p, long long x) {
    for (;p <= n; p += lowbit(p)) sum[p] += x;
}
long long query(int p) {
    long long ans = 0;
    for (;p; p -= lowbit(p)) ans += sum[p];
    return ans;
}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
        update(i, a[i]);
    }
    cin >> q;
    while (q --) {
        cin >> op;
        if (op == 1) {
            cin >> p >> x;
            update(p, x-a[p]);
            a[p] = x;
        }
        else {
            cin >> L >> R;
            cout << query(R) - query(L-1) << endl;
        }
    }
    return 0;
}
posted @ 2020-07-23 11:35  quanjun  阅读(176)  评论(0编辑  收藏  举报