#include <iostream>
#include "vision.h"
using namespace std;
vector<int> get1(int i, int j, int n, int m){
vector<int> v;
while (i < n and m > j and min(i, j) >= 0){
v.push_back(i * m + j);
i++, j--;
}
return v;
}
vector<int> get2(int i, int j, int n, int m){
vector<int> v;
while (i < n and m > j and min(i, j) >= 0){
v.push_back(i * m + j);
i++, j++;
}
return v;
}
void construct_network(int n, int m, int k){
vector<int> v1, v2, v3, v4;
for (int i=0;i<m;i++)
v1.push_back(add_or(get1(0, i, n, m)));
for (int i=1;i<n;i++)
v1.push_back(add_or(get1(i, m-1, n, m)));
for (int i=n-1;i>=0;i--)
v2.push_back(add_or(get2(i, 0, n, m)));
for (int i=1;i<m;i++)
v2.push_back(add_or(get2(0, i, n, m)));
for (int i=k;i<v1.size();i++){
v3.push_back(add_and({v1[i], v1[i - k]}));
v3.push_back(add_and({v2[i], v2[i - k]}));
}
for (int i=k+1;i<v1.size();i++){
v4.push_back(add_and({v1[i], v1[i - k - 1]}));
v1[i - k] = add_or({v1[i-k-1], v1[i-k]});
v4.push_back(add_and({v2[i], v2[i - k - 1]}));
v2[i - k] = add_or({v2[i-k-1], v2[i-k]});
}
if (v4.size() == 0)
add_or(v3);
else
add_and({add_or(v3), add_not(add_or(v4))});
}