/*
* poj2155.cpp
*
* Created on: 2010-8-7
* Author: friendy
*/
//每次只去改变给的位置和另外矩形顶点的位置
//举一个一维的例子,每次改变区间的端点,如果要求到点在这个之间,等到最后求1-x的和到时候,就会算一次,如果不在,有两种情况,无论是那个,两个
//改变的值相加对2取模是0所以和原来一样没有影响,这样就把求最后一个点改成了求和,更新的时候也是更新和。很好……很强大……&
#include
#include
#include
using namespace std;
int a[1001][1001],n,m;
//二维数组
int lowbit(int x){
return x&(-x);
}
//每次改变四个点
int get(int x,int y){
int i,j,res=0;
for(i=x;i<=n;i+=lowbit(i)){
for(j=y;j<=n;j+=lowbit(j)){
res=(res+a[i][j])%2;
}
}
return res;
}
void chang(int x,int y){
int i,j;
for(i=x;i>0;i-=lowbit(i)){
for(j=y;j>0;j-=lowbit(j)){
a[i][j]=(a[i][j]+1)%2;
}
}
}
int main(){
int t,x1,x2,y1,y2;
char ch;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
getchar();
while(m--){
ch=getchar();
if(ch=='C'){//去掉重复的
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
chang(x2,y2);
chang(x1-1,y1-1);
chang(x1-1,y2);
chang(x2,y1-1);
}
else{
scanf("%d%d",&x1,&y1);
printf("%d/n",get(x1,y1));
}
getchar();
}
if(t>0)
printf("/n");
}
return 0;
}
poj2155
最新推荐文章于 2025-01-03 19:49:02 发布