## POJ 2155 Matrix （二维树状数组）

Matrix
 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17224 Accepted: 6460

Description

Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1 <= i, j <= N).

We can change the matrix in the following way. Given a rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2), we change all the elements in the rectangle by using "not" operation (if it is a '0' then change it into '1' otherwise change it into '0'). To maintain the information of the matrix, you are asked to write a program to receive and execute two kinds of instructions.

1. C x1 y1 x2 y2 (1 <= x1 <= x2 <= n, 1 <= y1 <= y2 <= n) changes the matrix by using the rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2).
2. Q x y (1 <= x, y <= n) querys A[x, y].

Input

The first line of the input is an integer X (X <= 10) representing the number of test cases. The following X blocks each represents a test case.

The first line of each block contains two numbers N and T (2 <= N <= 1000, 1 <= T <= 50000) representing the size of the matrix and the number of the instructions. The following T lines each represents an instruction having the format "Q x y" or "C x1 y1 x2 y2", which has been described above.

Output

For each querying output one line, which has an integer representing A[x, y].

There is a blank line between every two continuous test cases.

Sample Input

1
2 10
C 2 1 2 2
Q 2 2
C 2 1 2 1
Q 1 1
C 1 1 2 1
C 1 2 1 2
C 1 1 2 2
Q 1 1
C 1 1 2 1
Q 2 1


Sample Output

1
0
0
1

 1 /* ***********************************************
2 Author        :kuangbin
3 Created Time  :2014/5/23 22:34:04
4 File Name     :E:\2014ACM\专题学习\数据结构\二维树状数组\POJ2155.cpp
5 ************************************************ */
6
7 #include <stdio.h>
8 #include <string.h>
9 #include <iostream>
10 #include <algorithm>
11 #include <vector>
12 #include <queue>
13 #include <set>
14 #include <map>
15 #include <string>
16 #include <math.h>
17 #include <stdlib.h>
18 #include <time.h>
19 using namespace std;
20 const int MAXN = 1010;
21 int lowbit(int x)
22 {
23     return x&(-x);
24 }
25 int c[MAXN][MAXN];
26 int n;
27 int sum(int x,int y)
28 {
29     int ret = 0;
30     for(int i = x;i > 0;i -= lowbit(i))
31         for(int j = y;j > 0;j -= lowbit(j))
32             ret += c[i][j];
33     return ret;
34 }
35 void add(int x,int y,int val)
36 {
37     for(int i = x;i <= n;i += lowbit(i))
38         for(int j = y;j <= n;j += lowbit(j))
39             c[i][j] += val;
40 }
41
42 int main()
43 {
44     //freopen("in.txt","r",stdin);
45     //freopen("out.txt","w",stdout);
46     int T;
47     scanf("%d",&T);
48     while(T--)
49     {
50         int q;
51         scanf("%d%d",&n,&q);
52         memset(c,0,sizeof(c));
53         char op[10];
54         int x1,y1,x2,y2;
55         while(q--)
56         {
57             scanf("%s",op);
58             if(op[0] == 'C')
59             {
60                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
65             }
66             else
67             {
68                 scanf("%d%d",&x1,&y1);
69                 if(sum(x1,y1)%2 == 0)printf("0\n");
70                 else printf("1\n");
71             }
72         }
73         if(T > 0)printf("\n");
74     }
75     return 0;
76 }

posted on 2014-05-23 22:52 kuangbin 阅读(...) 评论(...) 编辑 收藏

• 随笔 - 936
• 文章 - 0
• 评论 - 550
• 引用 - 0

JAVASCRIPT: