#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 + x < h; x++) {
for (int y = 0; y < K && j + y < w; y++) {
in.push_back((i + x) * w + j + y);
}
}
sq[i][j] = fre;
add_or(in);
add_xor(in);
fre += 2;
}
}
vector<int> sqs;
add_not(sq.back().back() + 1);
add_and({sq.back().back(), fre});
sqs.push_back(fre + 1);
fre += 2;
for (int i = 0; i + 1 < sq.size(); i++) {
for (int j = 0; j + 1 < sq.size(); j++) {
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});
add_not(fre + 1);
add_and({fre, fre + 2});
sqs.push_back(fre + 3);
fre += 4;
}
}
int fans = fre;
assert(!sqs.empty());
add_or(sqs);
fre++;
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 sans = fre;
assert(!sc.empty());
add_or(sc);
fre++;
add_and({fans, sans});
}
}