
Problem Description
Clarke is a patient with multiple personality disorder. One day, Clarke split into two personality a and b, they are playing a game.
There is a n∗m matrix, each grid of this matrix has a number ci,j.
a wants to beat b every time, so a ask you for a help.
There are q operations, each of them is belonging to one of the following two types:
. They play the game on a (x1,y1)−(x2,y2) sub matrix. They take turns operating. On any turn, the player can choose a grid which has a positive integer from the sub matrix and decrease it by a positive integer which less than or equal this grid's number. The player who can't operate is loser. a always operate first, he wants to know if he can win this game.
. Change ci,j to b.
Input
The first line contains a integer T(≤T≤), the number of test cases.
For each test case:
The first line contains three integers n,m,q(≤n,m≤,≤q≤∗)
Then n∗m matrix follow, the i row j column is a integer ci,j(≤ci,j≤)
Then q lines follow, the first number is opt.
if opt=, then integers x1,y1,x1,y2(≤x1≤x2≤n,≤y1≤y2≤m) follow, represent operation .
if opt=, then integers i,j,b follow, represent operation .
Output
For each testcase, for each operation , print Yes if a can win this game, otherwise print No.
Sample Input
Sample Output
Yes
No
Hint:
The first enquiry: $a$ can decrease grid $(1, 2)$'s number by $1$. No matter what $b$ operate next, there is always one grid with number $1$ remaining . So, $a$ wins.
The second enquiry: No matter what $a$ operate, there is always one grid with number $1$ remaining. So, $b$ wins.
The first enquiry: $a$ can decrease grid $(1, 2)$'s number by $1$. No matter what $b$ operate next, there is always one grid with number $1$ remaining . So, $a$ wins.
The second enquiry: No matter what $a$ operate, there is always one grid with number $1$ remaining. So, $b$ wins.
Source
题目要求二维的nim游戏,考虑到nim的结论是xor和为0则必败、否则必胜,那么我们只需要维护子矩阵的xor和。由于xor有前缀和性质,所以我们可以用一个二维bit来维护(1, 1)-(a, b)的矩阵的xor和,然后由sum(x2,y2) xor sum(x2,y1−1) xor sum(x1−1,y2) xor sum(x1−1,y1−1)sum(x2, y2) \ xor \ sum(x2, y1-1) \ xor \ sum(x1-1, y2) \ xor \ sum(x1-1, y1-1)sum(x2,y2) xor sum(x2,y1−1) xor sum(x1−1,y2) xor sum(x1−1,y1−1)来得到答案即可。单点修改在bit上是很容易的。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<bitset>
#include<map>
#include<vector>
#include<stdlib.h>
#include <stack>
using namespace std;
int dirx[]={,,-,};
int diry[]={-,,,};
#define PI acos(-1.0)
#define max(a,b) (a) > (b) ? (a) : (b)
#define min(a,b) (a) < (b) ? (a) : (b)
#define ll long long
#define eps 1e-10
#define MOD 1000000007
#define N 506
#define inf 1e12
int n,m,q;
int mp[N][N];
int a[N][N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&mp[i][j]);
a[i][j]=a[i][j-]^mp[i][j];
}
}
for(int i=;i<q;i++){
int opt;
scanf("%d",&opt);
int x,y,z;
if(opt==){
scanf("%d%d%d",&x,&y,&z);
mp[x][y]=z;
for(int j=y;j<=m;j++){
a[x][j]=a[x][j-]^mp[x][j];
}
}
else{
int ans=;
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(int j=x1;j<=x2;j++){
ans=ans^(a[j][y2]^a[j][y1-]);
}
if(ans==){
printf("No\n");
}
else{
printf("Yes\n");
}
}
}
}
return ;
}