#include "vision.h"
#include <bits/stdc++.h>
#include <cassert>
using namespace std;
void construct_network(int h, int w, int k) {
int fre = h * w;
const int K = 13;
if (k <= K) {
vector<vector<int>> sq((h + K - 1) / K, vector<int>((w + K - 1) / K));
for (int i = 0; i < sq.size(); i++) {
for (int j = 0; j < sq[i].size(); j++) {
vector<int> in;
for (int x = 0; x < K && i * K + x < h; x++) {
for (int y = 0; y < K && j * K + y < w; y++) {
in.push_back((i * K + x) * w + j * K + y);
}
}
sq[i][j] = fre;
add_or(in);
add_xor(in);
fre += 2;
}
}
vector<int> sqs;
for (int i = 0; i < sq.size(); i++) {
for (int j = 0; j < sq[i].size(); j++) {
if (i + 1 < sq.size() && j + 1 < sq[i].size()) {
add_or({sq[i][j], sq[i + 1][j], sq[i][j + 1], sq[i + 1][j + 1]});
add_xor({sq[i][j] + 1, sq[i + 1][j] + 1, sq[i][j + 1] + 1, sq[i + 1][j + 1] + 1});
} else if (i + 1 < sq.size()) {
add_or({sq[i][j], sq[i + 1][j]});
add_xor({sq[i][j] + 1, sq[i + 1][j] + 1});
} else if (j + 1 < sq[i].size()) {
add_or({sq[i][j], sq[i][j + 1]});
add_xor({sq[i][j] + 1, sq[i][j + 1] + 1});
} else {
add_or({sq[i][j]});
add_xor({sq[i][j] + 1});
}
add_not(fre + 1);
add_and({fre, fre + 2});
sqs.push_back(fre + 3);
fre += 4;
}
}
const int B = 50;
vector<int> sc;
for (int i = 0; i < B; i++) {
for (int j = 0; j < B; j++) {
vector<int> in1, in2;
for (int x = i; x < h; x += B) {
for (int y = j; y < w; y += B) {
in1.push_back(x * w + y);
for (int d = 0; d < k; d++) {
int x1 = x + d;
int y1 = y + k - d;
if (x1 >= 0 && x1 < h && y1 >= 0 && y1 < w) {
in2.push_back(x1 * w + y1);
}
}
for (int d = 0; d < k; d++) {
int x1 = x + k - d;
int y1 = y - d;
if (x1 >= 0 && x1 < h && y1 >= 0 && y1 < w) {
in2.push_back(x1 * w + y1);
}
}
}
}
if (!in1.empty() && !in2.empty()) {
add_or(in1);
add_or(in2);
add_and({fre, fre + 1});
sc.push_back(fre + 2);
fre += 3;
}
}
}
int fans = fre;
assert(!sqs.empty());
add_or(sqs);
fre++;
int sans = fre;
assert(!sc.empty());
add_or(sc);
fre++;
add_and({fans, sans});
fre++;
return;
}
const int B = 200;
vector<int> sc;
for (int i = 0; i < 1; i++) {
for (int j = 0; j < 1; j++) {
vector<int> in1, in2;
for (int x = i; x < h; x += B) {
for (int y = j; y < w; y += B) {
in1.push_back(x * w + y);
for (int d = 0; d < k; d++) {
int x1 = x + d;
int y1 = y + k - d;
if (x1 >= 0 && x1 < h && y1 >= 0 && y1 < w) {
in2.push_back(x1 * w + y1);
}
}
for (int d = 0; d < k; d++) {
int x1 = x + k - d;
int y1 = y - d;
if (x1 >= 0 && x1 < h && y1 >= 0 && y1 < w) {
in2.push_back(x1 * w + y1);
}
}
}
}
if (!in1.empty() && !in2.empty()) {
// add_or(in1);
add_or(in2);
add_and({in1[0], fre});
sc.push_back(fre + 1);
fre += 2;
}
}
}
assert(!sc.empty());
add_or(sc);
}