二维树状数组,每一行用一个树状数组表示
在求和和更新的时候,要对指定的行操作。
执行指令2 时,对l~r行逐个求和相加。
注意:把所有的坐标加一,树状数组更新数据时位置不能为零
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1030
#define lowbit(x) (x&-x)
using namespace std;
int c[N][N],n;
void add(int r,int k, int sum) {
while (k <= N) {
c[r][k] += sum;
k += lowbit(k);
}
}
int sum(int r,int k) {
int res = 0;
while (k) {
res += c[r][k];
k -= lowbit(k);
}
return res;
}
int main() {
int com;
while (EOF!=scanf("%d", &com)) {
if (com == 0) {
scanf("%d", &n);
}
else if (com == 1) {
int x, y, a;
scanf("%d%d%d", &x, &y, &a);
x++; y++;
add(x, y, a);
}
else if (com == 2) {
int l, b, r, t;
scanf("%d%d%d%d", &l, &b, &r, &t);
l++; b++; r++; t++;
int ans = 0;
for (int i = l; i <= r; i++)
ans += sum(i, t) - sum(i, b - 1);
printf("%d\n", ans);
}
else if (com == 3)break;
}
return 0;
}