使用树状数组实现单点更新+求区间和
题目大意:
给你一个长度为 \(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;
}