二维树状数组维护差分前缀和(并不知道说准确没有,反正大概就这个意思)
话说这个题在输出格式上挖坑我也是醉了,PE了两次。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int maxn=1002;
int n,m,c[maxn][maxn];
inline int read() {
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
inline int lowbit(int x) {
return x&-x;
}
inline void add(int x,int y,int v) {
for (int i=x;i<=n;i+=lowbit(i))
for (int j=y;j<=n;j+=lowbit(j))
c[i][j]+=v;
}
inline int query(int x,int y) {
int ans=0;
for (int i=x;i;i-=lowbit(i))
for (int j=y;j;j-=lowbit(j))
ans+=c[i][j];
return ans;
}
int main() {
// freopen("poj 2155.in","r",stdin);
int kase=read();
while (kase--) {
memset(c,0,sizeof(c));
n=read(),m=read();
while (m--) {
char ss[2];
scanf("%s",ss);
if (ss[0]=='C') {
int x1=read(),y1=read(),x2=read(),y2=read();
add(x1,y1,1),
add(x1,y2+1,-1),
add(x2+1,y1,-1),
add(x2+1,y2+1,1);
}
else {
int x=read(),y=read();
printf("%d\n",query(x,y)&1);
}
}
if (kase) puts("");
}
return 0;
}