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 "supertrees.h"
#include <bits/stdc++.h>
 
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define ford(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)
 
using namespace std;
 
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vpi;
typedef vector<vi> vvi;
typedef long long i64;
typedef vector<i64> vi64;
typedef vector<vi64> vvi64;
typedef pair<i64, i64> pi64;
typedef double ld;
struct trip {
    int ones=0,twos=0,threes=0;
};
int construct(vector<vector<int>> p) {
	int n = p.size();
	vector<vector<int>> answer(n);
	forn(i,n) {
		vi empty(n,0);
		answer[i]= empty;
	}
	
    map<int, set<int>>node_to_friends;
	vector<set<int>> clusters;
	vector<trip> class_type(n,{0,0,0});
	vi cluster_vec(n,-1);
	int cnt = 0;
	forn(i, n) {
		int cnt0 = 0;
		int cnt1 = 0;
		int cnt2 = 0;
		int cnt3 = 0;
		if (cluster_vec[i] == -1) {
			cluster_vec[i] = cnt;
			cnt++;
		}
		int cluster_id = cluster_vec[i];
		forn(j,n) {
			if (p[i][j] == 0) {
				cnt0++;
			}
			else if (p[i][j] == 1) {
				cnt1++;
				if (cluster_vec[j] == -1) {cluster_vec[j] = cluster_id;}
				else if (cluster_vec[j] != cluster_id) {return 0;} // contr
			}
			else if (p[i][j] == 2) {
				cnt2++;
				if (cluster_vec[j] == -1) {cluster_vec[j] = cluster_id;}
				else if (cluster_vec[j] != cluster_id) {return 0;} // contr
			}
			else if (p[i][j] == 3) {
				cnt3++;
				if (cluster_vec[j] == -1) {cluster_vec[j] = cluster_id;}
				else if (cluster_vec[j] != cluster_id) {return 0;} // contr
				
			}
            else {assert(0);}
		}
		if (cnt1 == 1 && cnt0 == n-1) {
			continue;
		}
		else {
            // check that there is connection
            forn(j,i) {
                if (cluster_vec[j] == cluster_id  && p[i][j] == 0) {
                    return 0;
                }
            if (p[i][j] == 1) {class_type[i].ones++; class_type[j].ones++;node_to_friends[i].insert(j);node_to_friends[j].insert(i);}
            if (p[i][j] == 2) {class_type[i].twos++; class_type[j].twos++;}
            if (p[i][j] == 3) {class_type[i].threes++; class_type[j].threes++;}
            }
        }
	}
	forn(i,cnt) {
		map<pair<int, pair<int,int>>, set<int>> combo_to_cnt;
        int cnt = 0;
		forn(j, n) {
			if (cluster_vec[j] == i) {
				// combo_to_cnt[{class_type[j].ones, {class_type[j].twos,class_type[j].threes}}]++;
                combo_to_cnt[{class_type[j].ones, {class_type[j].twos,class_type[j].threes}}].insert(j);
                cnt++;
			}   
		}
        if (cnt  <= 1) {
            continue;
        }
        vi circle;
        int to_push_start = -1;
        int to_push_end = -1;
        int two_pure = -1;
        int three_pure = -1;
        for(const auto &myPair : combo_to_cnt) {
            if (myPair.fi.fi == 0 && myPair.fi.se.fi == 0 && myPair.fi.se.se >0 ) {
                three_pure = myPair.se.size();
            }
            if (myPair.fi.fi == 0 && myPair.fi.se.fi > 0) {
                two_pure = myPair.se.size();
                int cnt = 0;
                int cur_node = -1;
                for (int node: myPair.se) {
                    if (cnt == 0) {
                        // circle.pb(node);
                        to_push_start = node;
                    }
                    else {
                        answer[node][cur_node] = 1;
                        answer[cur_node][node] = 1;
                    }
                    
                    cur_node = node;
                    cnt++;
                    if (cnt == myPair.se.size()) {
                        // circle.pb(node);
                        to_push_end = node;
                    }
                }
                continue;
            }
            
            
            int cnt = 0;
            int cur_node = -1;
            bool cont = false;
            vector<bool> visited(n, 0);
            for (int node: myPair.se) {
                if (visited[node]) {continue;}
                visited[node] = true;
                circle.pb(node);
                cur_node = node;
                for (int next_node: node_to_friends[node]) {
                    if (visited[next_node]) {return 0;}
                    visited[next_node] = true;
                    answer[next_node][cur_node] = 1;
                    answer[cur_node][next_node] = 1;
                    cur_node = next_node;
                }
            }
        }
        if (to_push_end != -1) {
            circle.insert(circle.begin(), to_push_start);
            circle.pb(to_push_end);
        }
        
        if ((two_pure == 1 || two_pure == 2) && circle.size() <= 2) {
            return 0;
        }
        if ((three_pure == 0 || three_pure == 1 || three_pure == 2 || three_pure == 3 || three_pure == 4)) {
            return 0;
        }
        if (three_pure == circle.size()) {
            return 0;
        }
        int bonus;
        if (two_pure == - 1) {
            bonus = 1;
        }
        else {
            bonus = 0;
        }
        forn(j, circle.size()-1 + bonus) {
            if (circle[j] != circle[(j+1)%circle.size()]) {
                answer[circle[j]][circle[(j+1)%circle.size()]] = 1;
                answer[circle[(j+1)%circle.size()]][circle[j]] = 1;
            }
        }
    }
	build(answer);
	return 1;
}
Compilation message (stderr)
supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:134:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::set<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  134 |                     if (cnt == myPair.se.size()) {
      |                         ~~~~^~~~~~~~~~~~~~~~~~~
supertrees.cpp:143:17: warning: unused variable 'cnt' [-Wunused-variable]
  143 |             int cnt = 0;
      |                 ^~~
supertrees.cpp:145:18: warning: unused variable 'cont' [-Wunused-variable]
  145 |             bool cont = false;
      |                  ^~~~
supertrees.cpp:172:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  172 |         if (three_pure == circle.size()) {
      |             ~~~~~~~~~~~^~~~~~~~~~~~~~~~| # | 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... |