#include <bits/stdc++.h>
#include "vision.h"
using namespace std;
int cur;
vector <vector <int>> d(500);
void get(int n, int k) {
vector <int> qor(n);
vector <int> qxor(n);
vector <int> res;
for (int i = 0; i < n; i++) {
qor[i] = ++cur;
add_or(d[i]);
qxor[i] = ++cur;
add_xor(d[i]);
res.emplace_back(++cur);
add_xor({qor[i],qxor[i]});
}
for (int i = k-1; i < n; i++) {
vector <int> v;
for (int j = i-k+1; j <= i; j++) {
v.emplace_back(qor[j]);
}
int nor = ++cur;
add_or(v);
int nxor = ++cur;
add_xor(v);
res.emplace_back(++cur);
add_xor({nor,nxor});
}
cur++;
add_or(res);
}
void getans(int n, int m, int k) {
for (int i = 0; i < n+m; i++) {
d[i].clear();
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
d[i-j+m-1].emplace_back(i*m+j);
}
}
get(n+m-1,k);
int cur1 = cur;
for (int i = 0; i < n+m; i++) {
d[i].clear();
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
d[i+j].emplace_back(i*m+j);
}
}
get(n+m-1,k);
int cur2 = cur;
add_and({cur2,cur1});
cur++;
}
void construct_network(int H, int W, int K) {
cur = H*W-1;
getans(H,W,K);
int cur1 = cur;
getans(H,W,K+1);
int cur2 = cur;
add_xor({cur1,cur2});
}