#include "vision.h"
#include <vector>
using namespace std;
/*
from end of squre:
odd ind -> actual binary
even ind -> leftover
acc = leftover^lastacc
leftover = acc&lastleftover
*/
void construct_network(int H, int W, int K) {
auto ind = [&](int i,int j){
return i*W+j;
};
int last = H*W;
int cur = H*W+19;
vector<int> all;
for(int i{};i < H;i++){
for(int j{};j < W;j++) all.emplace_back(ind(i,j));
}
for(int i{};i < 19;i++) add_xor(all);
auto process = [&](){
for(int i{1};i < 19;i++){
if(i&1) add_xor({last+i,cur+i-1});
else add_and({last+i-1,cur+i-2});
}
last = cur;
cur += 19;
};
vector<int> vc;
for(int i{};i < H;i++){
for(int j{};j < W;j++) vc.emplace_back(ind(i,j));
add_xor(vc);
process();
}
vc.clear();
for(int i{};i < W;i++){
for(int j{};j < H;j++) vc.emplace_back(ind(j,i));
add_xor(vc);
process();
}
for(int i{};i < 19;i++) add_not(last+i);
vc.clear();
for(int i{};i < 9;i++){
if((K>>i)&1) vc.emplace_back(last+i*2+1);
else vc.emplace_back(cur+i*2+1);
}
add_and(vc);
}