Problem Description


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: 
1. 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. 
2. Change  ci,j to  b. 


 



Input


T(1≤T≤5), the number of test cases. 
For each test case: 
The first line contains three integers  n,m,q(1≤n,m≤500,1≤q≤2∗105) 
Then  n∗m matrix follow, the  i row  j column is a integer  ci,j(0≤ci,j≤109) 
Then  q lines follow, the first number is  opt. 
if  opt=1, then  4 integers  x1,y1,x1,y2(1≤x1≤x2≤n,1≤y1≤y2≤m) follow, represent operation  1. 
if  opt=2, then  3 integers  i,j,b follow, represent operation  2.


 



Output


1, print  Yes if  a can win this game, otherwise print  No.


 



Sample Input


1 1 2 3 1 2 1 1 1 1 2 2 1 2 1 1 1 1 1 2


 



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.


 



nim取子游戏+前缀和

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long LL;
const int maxn = 505;
int T, n, m, q, cs, x, y, X, Y, z, a[maxn][maxn], f[maxn][maxn];

int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d%d", &n, &m, &q);
for (int i = 1; i <= n; i++)
{
f[i][0] = 0;
for (int j = 1; j <= m; j++)
{
scanf("%d", &a[i][j]);
f[i][j] = a[i][j] ^ f[i][j - 1];
}
}
while (q--)
{
scanf("%d", &cs);
if (cs == 1)
{
scanf("%d%d%d%d", &x, &y, &X, &Y);
int flag = 0;
for (int i = x; i <= X; i++) flag ^= f[i][y - 1] ^ f[i][Y];
if (flag) printf("Yes\n"); else printf("No\n");
}
else
{
scanf("%d%d%d", &x, &y, &z);
a[x][y] = z;
for (int i = y; i <= m; i++) f[x][i] = a[x][i] ^ f[x][i - 1];
}
}
}
return 0;
}