首页 > 代码库 > poj2155

poj2155

题目连接:POJ - 2155

二维树状数组

 1 #include<cstdio>
 2 #include<cstring>
 3 const int maxn=1010;
 4 int n,m;
 5 int c[maxn][maxn];
 6 int lowbit(int x)
 7 {
 8     return x&(-x);
 9 }
10 void add(int x,int y)
11 {
12     for(int i=x;i<=n;i+=lowbit(i))
13         for(int j=y;j<=n;j+=lowbit(j))
14         c[i][j]++;
15 }
16 int sum(int x,int y)
17 {
18     int sum=0;
19     for(int i=x;i>=1;i-=lowbit(i))
20         for(int j=y;j>=1;j-=lowbit(j))
21         sum+=c[i][j];
22     return sum;
23 }
24 int x1,y1,x2,y2;
25 int main()
26 {
27     int t;
28     char s[5];
29     scanf("%d",&t);
30     while(t--)
31     {
32         memset(c,0,sizeof(c));
33         scanf("%d%d",&n,&m);
34         for(int i=0;i<m;i++)
35         {
36             scanf("%s",s);
37             if(s[0]==C)
38             {
39                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
40                 add(x2+1,y2+1);
41                 add(x1,y1);
42                 add(x1,y2+1);
43                 add(x2+1,y1);
44             }
45             else
46             {
47                 scanf("%d%d",&x1,&y1);
48                 int ans=sum(x1,y1);
49                 if(ans%2) puts("1");
50                 else puts("0");
51             }
52         }
53         puts("");
54     }
55     return 0;
56 }

 

poj2155