二维bit + 尼姆博奕
#include <iostream>
#include <cstdio>
#include <cstring>
#define Max 510
using namespace std;
int n, m;
int a[Max][Max];
int c[Max][Max];
int lowbit(int x) {
return x & (-x);
}
int sum(int x, int y) {
int ret = 0;
for(int i = x; i > 0; i -= lowbit(i))
for(int j = y; j > 0; j -= lowbit(j))
ret ^= c[i][j];
return ret;
}
void add(int x, int y, int val) {
for(int i = x; i <= n; i += lowbit(i))
for(int j = y; j <= m; j += lowbit(j))
c[i][j] ^= val;
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
int q;
scanf("%d%d%d", &n, &m, &q);
memset(c, 0, sizeof(c));
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
scanf("%d", &a[i][j]);
add(i, j, a[i][j]);
}
int op, x1, y1, x2, y2;
while(q--) {
scanf("%d", &op);
if(op == 1) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
int ans = sum(x2, y2) ^ sum(x2, y1 - 1) ^ sum(x1 - 1, y2) ^ sum(x1 - 1, y1 - 1);
if(ans)
printf("Yes\n");
else
printf("No\n");
}
else {
int val;
scanf("%d%d%d", &x1, &y1, &val);
add(x1, y1, a[x1][y1]);
add(x1, y1, val);
a[x1][y1] = val;
}
}
}
return 0;
}