二维树状数组 BZOJ 1452 [JSOI2009]Count

 

题目链接

裸二维树状数组

#include <bits/stdc++.h>
 
const int N = 305;
struct BIT_2D {
    int c[105][N][N], n, m;
    void init(int n, int m) {
        memset (c, 0, sizeof (c));
        this->n = n;
        this->m = m;
    }
    void updata(int k, int x, int y, int z) {
        for (int i=x; i<=n; i+=i&(-i)) {
            for (int j=y; j<=m; j+=j&(-j)) {
                c[k][i][j] += z;
            }
        }
    }
    int query(int k, int x, int y) {
        int ret = 0;
        for (int i=x; i; i-=i&(-i)) {
            for (int j=y; j; j-=j&(-j)) {
                ret += c[k][i][j];
            }
        }
        return ret;
    }
    int count(int x1, int x2, int y1, int y2, int a) {
        return query (a, x2, y2) - query (a, x2, y1-1) - query (a, x1-1, y2) + query (a, x1-1, y1-1);
    }
};
 
int a[N][N];
BIT_2D bit;
 
int read() {
    int ret = 0, f = 1;
    char ch = getchar ();
    while (ch < '0' || ch > '9') {
        if (ch == '-') {
            f = -1;
        }
        ch = getchar ();
    }
    while (ch >= '0' && ch <= '9') {
        ret = ret * 10 + ch - '0';
        ch = getchar ();
    }
    return ret * f;
}

int main() {
    int n, m;
    while (scanf ("%d%d", &n, &m) == 2) {
        bit.init (n, m);
        for (int i=1; i<=n; ++i) {
            for (int j=1; j<=m; ++j) {
                //scanf ("%d", &a[i][j]);
                a[i][j] = read ();
                bit.updata (a[i][j], i, j, 1);
            }
        }
        int q;
        scanf ("%d", &q);
        while (q--) {
            int op, x1, x2, y1, y2, x;
            scanf ("%d", &op);
            if (op == 1) {
                //scanf ("%d%d%d", &x1, &y1, &x);
                x1 = read (); y1 = read (); x = read ();
                bit.updata (a[x1][y1], x1, y1, -1);
                a[x1][y1] = x;
                bit.updata (a[x1][y1], x1, y1, 1);
            } else {
                //scanf ("%d%d%d%d%d", &x1, &x2, &y1, &y2, &x);
                x1 = read (); x2 = read (); y1 = read (); y2 = read (); x = read ();
                printf ("%d\n", bit.count (x1, x2, y1, y2, x));
            }
        }
    }
    return 0;
}

  

posted @ 2016-05-17 21:46  Running_Time  阅读(133)  评论(0编辑  收藏  举报