二维树状数组之模板2


#include <cstdio>
#include <algorithm>

using namespace std;
/*代码来自大佬。*/
const int kMax = 1000 + 10;

int n;
int num[kMax][kMax];

inline int lowbit(int x) { return x & -x; }

int getsum(int x, int y) {
    if(!x || !y) return 0;
    int res = 0;
    for(int i = x;i;i -= lowbit(i)) {
        for(int j = y;j;j -= lowbit(j)) {
            res += num[i][j];
        }
    }
    return res;
}

void add(int x, int y, int val) {
    for(int i = x;i <= n;i += lowbit(i)) {
        for(int j = y;j <= n;j += lowbit(j)) {
            num[i][j] += val;
        }
    }
}

int main() {
    int q, x1, y1, x2, y2, val;
    char op;
    scanf("%d%d", &n, &q);
    while(q --) {
        scanf("\n%c%d%d", &op, &x1, &y1);
        if(op == 'C') {
            scanf("%d", &val);
            add(x1, y1, val);
        } else {
            scanf("%d%d", &x2, &y2);
            printf("%d\n", 
                   getsum(x2, y2) - 
                   getsum(x1 - 1, y2) - 
                   getsum(x2, y1 - 1) + 
                   getsum(x1 - 1, y1 - 1));
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39145990/article/details/80071463