poj2155 Matrix 二维树状数组

一道模板题。

然而和一维的差不多。

//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<queue>
#include<ctime>
const int N=1007;
typedef long long LL;
using namespace std;
int T,n,q,sum[N][N],x,y,x1,y1; 
char o[20];

template<typename T> void read(T &x) {
    char ch=getchar(); x=0; T f=1;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') f=-1,ch=getchar();
    for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}

void add(int x,int y,int v) {
    for(int i=x;i<=n;i+=(i&(-i))) 
        for(int j=y;j<=n;j+=(j&(-j))) 
            sum[i][j]+=v;
}

int qry(int x,int y) {
    int res=0;
    for(int i=x;i;i-=(i&(-i))) 
        for(int j=y;j;j-=(j&(-j))) 
            res+=sum[i][j];
    return res;
}

void work() {
    read(T);
    while(T--) {
        read(n);
        read(q);
        memset(sum,0,sizeof(sum));
        while(q--) {
            scanf("%s",o);
            if(o[0]=='C') {
                read(x); read(y);
                read(x1); read(y1);
                add(x,y,1);
                add(x,y1+1,-1);
                add(x1+1,y,-1);
                add(x1+1,y1+1,1);
            }
            else {
                read(x); read(y);
                printf("%d\n",qry(x,y)%2);
            }
        } 
        if(T) printf("\n");
    }
}

int main() {
#ifdef DEBUG
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#endif
    work();
    return 0;
}
View Code

 

posted @ 2017-12-11 07:09  啊宸  阅读(103)  评论(0编辑  收藏  举报