This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "vision.h"
#include <tuple>
using namespace std;
int GH, GW;
int coord(int i, int j) {
	return i * GW + j;
};
void construct_network(int H, int W, int K) {
	tie(GH, GW) = {H, W};
//	std::vector<int> Ns;
//	Ns = {0, 1};
//	int a = add_and(Ns);
//	Ns = {0, a};
//	int b = add_or(Ns);
//	Ns = {0, 1, b};
//	int c = add_xor(Ns);
//	add_not(c);
	vector<int> left_diags_or, right_diags_or;
	vector<int> left_diags_xor, right_diags_xor;
	// Base diagonal processing
		//add left diagonals
		for (int sum = 0; sum <= H + W - 2; sum++){
			vector<int> tmp;
			for (int r = 0, c = sum; c >= 0 && r < H; r++, c--){
				if (c < W) {
					tmp.push_back(coord(r, c));
				}
			}
			if (tmp.empty()) continue;
//			printf("add left squares: ");
//			for (int i : tmp) {
//				printf("{%d, %d} ", i / W, i % W);
//			}
//			puts("");
			left_diags_or.push_back(add_or(tmp));
			left_diags_xor.push_back(add_xor(tmp));
		}
		//add right diagonals
		for (int diff = -H + 1; diff <= W; diff++) {
			vector<int> tmp;
			for (int r = H - 1, c = H - 1 + diff; r >= 0; r--, c--) {
				if (0 <= c && c < W) {
					tmp.push_back(coord(r, c));
				}
			}
			if (tmp.empty()) continue;
//			printf("add right squares: ");
//			for (int i : tmp) {
//				printf("{%d, %d} ", i / W, i % W);
//			}
//			puts("");
			right_diags_or.push_back(add_or(tmp));
			right_diags_xor.push_back(add_xor(tmp));
		}
	//
	// or -> 1 if has black pixel in diag, 0 otherwise
	// xor -> if 0 where or is 1, then 2 black in diag. if 1 then 1 black.
	//puts("start diags2");
	vector<int> left_diags_has2, right_diags_has2;
	for (int i = 0, sz = left_diags_or.size(); i < sz; i++){
		vector<int> curr = {left_diags_or[i], left_diags_xor[i]};
		left_diags_has2.push_back(add_xor(curr));
	}
	for (int i = 0, sz = right_diags_or.size(); i < sz; i++){
		vector<int> curr = {right_diags_or[i], right_diags_xor[i]};
		right_diags_has2.push_back(add_xor(curr));
	}
	//puts("add 2diags done");
	vector<int> left_k1, right_k1;
	for (int i = 0, j = K, sz = left_diags_has2.size(); j < sz; i++, j++){
		vector<int> curr;
		for (int x = i; x <= j; x++) {
			curr.push_back(left_diags_has2[x]);
		}
		int has2samecol = add_or(curr);
		curr.clear();
		for (int x = i; x <= j; x++){
			curr.push_back(left_diags_or[x]);
		}
		int has2difcol = add_xor({add_or(curr), add_xor(curr)});
		left_k1.push_back(add_or({has2samecol, has2difcol}));
	}
	for (int i = 0, j = K, sz = right_diags_has2.size(); j < sz; i++, j++){ vector<int> curr;
		for (int x = i; x <= j; x++) {
			curr.push_back(right_diags_has2[x]);
		}
		int has2samecol = add_or(curr);
		curr.clear();
		for (int x = i; x <= j; x++){
			curr.push_back(right_diags_or[x]);
		}
		int has2difcol = add_xor({add_or(curr), add_xor(curr)});
		right_k1.push_back(add_or({has2samecol, has2difcol}));
	}
	int k1val = add_and({add_or(left_k1), add_or(right_k1)});
	//puts("k1 done");
	vector<int> left_k, right_k;
	for (int i = 0, j = K - 1, sz = left_diags_has2.size(); j < sz; i++, j++){
		vector<int> curr;
		for (int x = i; x <= j; x++) {
			curr.push_back(left_diags_has2[x]);
		}
		int has2samecol = add_or(curr);
		curr.clear();
		for (int x = i; x <= j; x++){
			curr.push_back(left_diags_or[x]);
		}
		int has2difcol = add_xor({add_or(curr), add_xor(curr)});
		left_k.push_back(add_or({has2samecol, has2difcol}));
	}
	for (int i = 0, j = K - 1, sz = right_diags_has2.size(); j < sz; i++, j++){ vector<int> curr;
		for (int x = i; x <= j; x++) {
			curr.push_back(right_diags_has2[x]);
		}
		int has2samecol = add_or(curr);
		curr.clear();
		for (int x = i; x <= j; x++){
			curr.push_back(right_diags_or[x]);
		}
		int has2difcol = add_xor({add_or(curr), add_xor(curr)});
		right_k.push_back(add_or({has2samecol, has2difcol}));
	}
	int kval = add_and({add_or(left_k), add_or(right_k)});
	//puts("k done");
	add_and({k1val, add_xor({kval, k1val})});
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |