二维树状数组

lowbit函数

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

修改以及建树的函数

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

一点要注意建树的数据范围,根据题目的要求来确定建树的范围。

查询函数

int query(int x,int y) {
    int res = 0;
    for (int i = x; i; i -= lowbit(i)) {
        for (int j = y; j; j -= lowbit(j)) {
            res += tr[i][j];
        }
    }
    return res;
}
 
int query(int x1,int y1,int x2,int y2){
    return query(x2,y2)-query(x2,y1-1)-query(x1-1,y2)+query(x1-1,y1-1);
}