题目大意:一个二维坐标轴上有很多点,点不是0就是1。然后又两种操作。
C:改变以 (x1, y1) 为左上顶点 (x2,y2 )为右下顶点 中的每一个点 0变1 1变0
Q:输出 A【x】【y】
然后每次改变都取异或 这样的话就意味着改变偶数次就变回来了 奇数次的话就是做了改变的
#include <iostream>
#include <cstdio>
#include <algorithm>
#define maxn 1005
#define lson num<<1,s,mid
#define rson num<<1|1,mid+1,e
using namespace std;
bool tree[maxn<<2][maxn<<2];
int n,ans;
void buildy(int num,int s,int e,int rt)
{
tree[rt][num]=0;
if(s==e)return;
int mid=(s+e)>>1;
buildy(lson,rt);
buildy(rson,rt);
}
void buildx(int num,int s,int e)
{
buildy(1,1,n,num);
if(s==e)return;
int mid=(s+e)>>1;
buildx(lson);
buildx(rson);
}
void updatey(int num,int s,int e,int l,int r,int rt)
{
if(l<=s && r>=e)
{
tree[rt][num]^=1;
return ;
}
int mid=(s+e)>>1;
if(r>mid)updatey(rson,l,r,rt);
if(l<=mid)updatey(lson,l,r,rt);
}
void updatex(int num,int s,int e,int l,int r,int u,int d)
{
if(l<=s && r>=e)
{
updatey(1,1,n,u,d,num);
return;
}
int mid=(s+e)>>1;
if(r>mid)
updatex(rson,l,r,u,d);
if(l<=mid)
updatex(lson,l,r,u,d);
}
void queryy(int num,int s,int e,int y,int rt)
{
ans^=tree[rt][num];
if(s==e)return;
int mid=(s+e)>>1;
if(y<=mid)queryy(lson,y,rt);
else if(y>mid)queryy(rson,y,rt);
}
void queryx(int num,int s,int e,int x,int y)
{
queryy(1,1,n,y,num);
if(s==e)
{
return;
}
int mid=(s+e)>>1;
if(x>mid)queryx(rson,x,y);
else if(x<=mid)queryx(lson,x,y);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int op;
scanf("%d%d",&n,&op);
buildx(1,1,n);
while(op--)
{
char p[10];
scanf("%s",p);
if(p[0]=='C')
{
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
updatex(1,1,n,x1,x2,y1,y2);
}
else
{
int a,b;
scanf("%d%d",&a,&b);
ans=0;
queryx(1,1,n,a,b);
printf("%d\n",ans);
}
}
puts("");
}
return 0;
}