链接
树状数组板子题.
参考代码:
#include <bits/stdc++.h>
#define lowbit(x) (x & (-x))
using i64 = long long;
constexpr int MOD = 998244353, N = 5e4 + 10, inf = 2e9;
template <typename T>
inline void read(T &f) {
f = 0; T fu = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
f *= fu;
}
i64 tree[N], n, m;
void add(int i, int j) {
for (int x = i; x <= n; x += lowbit(x)) {
tree[x] += j;
}
}
i64 query(int x) {
i64 ans = 0;
for (int i = x; i >= 1; i -= lowbit(i)) {
ans += tree[i];
}
return ans;
}
int mark = 0;
void solve() {
std::memset(tree, 0LL, sizeof tree);
read(n);
int a[n + 1];
for (int i = 1; i <= n; i++) {
read(a[i]);
add(i, a[i]);
}
std::string s;
bool f = false;
while (std::cin >> s && s != "End") {
if (s == "Query" && f == false) {
printf("Case %d:\n", ++mark);
f = true;
}
if (s == "Query") {
int l, r;
read(l), read(r);
printf("%lld\n", query(r) - query(l - 1));
} else if (s == "Add") {
int u, v;
read(u), read(v);
add(u, v);
} else if (s == "Sub") {
int u, v;
read(u), read(v);
add(u, -v);
}
}
}
int main() {
int t; read(t);
while (t--) {
solve();
}
return 0;
}