#include "vision.h"
#include <bits/stdc++.h>
using namespace std;
void construct_network(int h,int w,int k)
{
vector<int> dig1,dig2;
map<int,vector<int>> sm,sb;
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
sm[i+j].push_back(i*w+j);
sb[i-j].push_back(i*w+j);
}
}
for(auto tt:sm)
{
dig1.push_back(add_or(tt.second));
}
for(auto tt:sb)
{
dig2.push_back(add_or(tt.second));
}
vector<int> o1=dig1,o2=dig2;
// for(int i=dig1.size()-2;i>=0;i--)
// dig1[i]=add_or({dig1[i],dig1[i+1]});
// for(int i=dig2.size()-2;i>=0;i--)
// dig2[i]=add_or({dig2[i],dig2[i+1]});
int gk=0;
// check if exact k
for(int i=0;i<dig1.size();i++)
{
if(i+k<dig1.size())
{
if(!gk)gk=add_and({o1[i],o1[i+k]});
else gk=add_or({gk,add_and({o1[i],o1[i+k]})});
}
if(i+k<dig2.size())
{
if(!gk)gk=add_and({o2[i],o2[i+k]});
else gk=add_or({gk,add_and({o2[i],o2[i+k]})});
}
}
// check if atmost k
// >=k+1
// <k+1
// <=k
int akm=0,val=0;
for(int i=0;i<dig1.size();i++)
{
vector<int> cur;
for(int p=i+k+1;p<dig1.size();p++)
{
cur.push_back(o1[p]);
}
if(cur.size())
{
val=add_and({o1[i],add_or(cur)});
if(!akm)akm=val;
else akm=add_or({akm,val});
}
cur.clear();
for(int p=i+k+1;p<dig2.size();p++)
{
cur.push_back(o2[p]);
}
if(cur.size())
{
val=add_and({o2[i],add_or(cur)});
if(!akm)akm=val;
else akm=add_or({akm,val});
}
}
if(!akm)
{
add_or({gk});
}
else
{
add_and({gk,add_not(akm)});
}
return;
}