点击查看折叠代码块
/*
二维树状数组+差分容斥
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e3+10;
int c[maxn][maxn];//二维树状数组
int T,n,m;
int lowbit(int x){
return x&-x;
}
void update(int x,int y,int v){
while(x<=n){
int yy=y;
while(yy<=n){
c[x][yy]+=v;
yy+=lowbit(yy);
}
x+=lowbit(x);
}
}
int query(int x,int y){
int ans=0;
while(x){
int yy=y;
while(yy){
ans+=c[x][yy];
yy-=lowbit(yy);
}
x-=lowbit(x);
}
return ans;
}
int main(){
scanf("%d",&T);
while(T--){
memset(c,0,sizeof(c));
scanf("%d%d",&n,&m);
char s[2];
for (int i=1;i<=m;i++){
scanf("%s",s);
if(s[0]=='C'){
int r1,c1,r2,c2;
scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
update(r1,c1,1);
update(r1,c2+1,-1);
update(r2+1,c1,-1);
update(r2+1,c2+1,1);
}
else{
int x,y;
scanf("%d%d",&x,&y);
int ans=query(x,y)%2;
printf("%d
",ans);
}
}
printf("
");
}
return 0;
}