#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+H+W+4;
int cur = H*W+H+W+23;
vector<int> all;
for(int i{};i < H;i++){
for(int j{};j < W;j++) all.emplace_back(ind(i,j));
}
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;
};
add_xor(all);
add_not(H*W);
add_not(H*W+1);
for(int i{};i < H;i++){
vector<int> vc;
for(int j{};j < W;j++) vc.emplace_back(ind(i,j));
add_xor(vc);
}
add_not(H*W+1);
for(int i{};i < W;i++){
vector<int> vc;
for(int j{};j < H;j++) vc.emplace_back(ind(j,i));
add_xor(vc);
}
for(int i{};i < 19;i++) add_not(H*W+1);
for(int i{};i < H;i++){
add_xor({last,H*W+i+3});
process();
}
for(int i{};i < W;i++){
add_xor({last,H*W+i+H+4});
process();
}
for(int i{};i < 19;i++) add_not(last+i);
vector<int> val;
for(int i{};i < 9;i++){
if((K>>i)&1) val.emplace_back(last+i*2+1);
else val.emplace_back(cur+i*2+1);
}
add_and(val);
}