题目连接: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 }