敌人N个军营,每个军营人数经常变动,快速统计连续几个军营多少士兵
分析:单点修改,区间查询
#include<iostream>
using namespace std;
int c[50005];
int N;
int lowbit(int n) {
return n & (-n);
}
void update(int c[], int i, int val) {
while (i <= N) {
c[i] += val;
i += lowbit(i);
}
}
int sum(int c[], int i) {
int res = 0;
while (i) {
res += c[i];
i -= lowbit(i);
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t;
cin >> t;
for (int cnt = 1; cnt <= t; ++cnt) {
cin >> N;
for (int i = 1; i <= N; ++i) {
c[i] = 0;
}
for (int i = 1; i <= N; ++i) {
int x;
cin >> x;
update(c, i, x);
}
cout << "Case " << cnt << ":\n";
string s;
while (cin >> s && s != "End") {
if (s[0] == 'A') {
int i, j;
cin >> i >> j;
update(c, i, j);
}
if (s[0] == 'S') {
int i, j;
cin >> i >> j;
update(c, i, -j);
}
if (s[0] == 'Q') {
int i, j;
cin >> i >> j;
cout << sum(c,j) - sum(c,i - 1) << "\n";
}
}
}
return 0;
}