二维线段树,不像hdu1823用4分搞定,这题4分会超时,用树套树即可
#include
#include
bool seg[4010][4010];
int n,m,T,ans;
void udy(int i,int l,int r,int j,int y1,int y2)
{
if(l==y1&&r==y2)
{
seg[i][j]^=1;
return;
}
int mid=(l+r)>>1;
if(mid>=y2)
udy(i,l,mid,2*j,y1,y2);
else
if(y1>mid)
udy(i,mid+1,r,2*j+1,y1,y2);
else
{
udy(i,l,mid,2*j,y1,mid);
udy(i,mid+1,r,2*j+1,mid+1,y2);
}
}
void udx(int i,int l,int r,int x1,int x2,int y1,int y2)
{
if(l==x1&&r==x2)
{
udy(i,1,n,1,y1,y2);
return;
}
int mid=(l+r)>>1;
if(mid>=x2)
udx(2*i,l,mid,x1,x2,y1,y2);
else
if(x1>mid)
udx(2*i+1,mid+1,r,x1,x2,y1,y2);
else
{
udx(2*i,l,mid,x1,mid,y1,y2);
udx(2*i+1,mid+1,r,mid+1,x2,y1,y2);
}
}
void quy(int i,int l,int r,int j,int y)
{
ans^=seg[i][j];
if(l==r)
return;
int mid=(l+r)>>1;
if(mid>=y)
quy(i,l,mid,2*j,y);
else
quy(i,mid+1,r,2*j+1,y);
}
void qux(int i,int l,int r,int x,int y)
{
quy(i,1,n,1,y);
if(l==r)
return;
int mid=(l+r)>>1;
if(mid>=x)
qux(2*i,l,mid,x,y);
else
qux(2*i+1,mid+1,r,x,y);
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(seg,0,sizeof(seg));
for(int i=0;i