讲解这题的过程需要一些图,有空再上图好了
#include<iostream>
#include<string>
#include<algorithm>
#define M 1001
using namespace std;
int C[M][M],n;
void update(int x,int y,int val) //更新区间
{
if(x<=0||y<=0) return ;
while(x<=n)
{
int y1=y;
while(y1<=n)
{
C[x][y1]+=val;
y1+=y1&(-y1);
}
x+=x&(-x);
}
}
int sum(int x,int y) //查询这个点被翻过几次
{
if(x<=0||y<=0) return 0;
int s=0,xx=x,yy=y;
while(x>0)
{
int y1=y;
while(y1>0)
{
s+=C[x][y1];
y1-=y1&(-y1);
}
x-=x&(-x);
}
return s;
}
int main()
{
int t,m,x1,x2,y1,y2,ans,i;
char str;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
memset(C,0,sizeof(C)); //初始化
for(i=1;i<=m;i++)
{
getchar();
scanf("%c",&str);
if(str=='C')
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
update(x1,y1,1);
update(x1,y2+1,1);
update(x2+1,y1,1);
update(x2+1,y2+1,1);
}
else
{
scanf("%d%d",&x1,&y1);
ans=sum(x1,y1);
ans=ans%2;
printf("%d\n",ans);
}
}
cout<<endl;
}
}