#include "islands.h"
#include <map>
#include <variant>
#include <vector>
#include <algorithm>
using namespace std;
#define pb push_back
#define mp make_pair
variant<bool, vector<int>> find_journey(int N, int M, vector<int> U, vector<int> V) {
	vector<int> answer;
	if(N==2){ // subtask 1
		vector<int> A, B;
		for(int i=0; i<M; i++){
			if(U[i]==0 && V[i]==1){
				A.pb(i);
			} else{
				B.pb(i);
			}
		}
		if(A.size()>1 && B.size()>0){
			answer = {A[0], B[0], A[1], A[0], B[0], A[1]};
			return answer;
		} else{
			return false;
		}
	}
	
	// subtask 3 (21 marks)
	vector<vector<int>> adj(N);
	map<pair<int, int>, int> can;
	int u,v;
	for(int i=0; i<M; i++){
		u=U[i];
		v=V[i];
		adj[u].pb(v);
		can[mp(u,v)]=i;
	}
	if(adj[0].size() > 1){
		// simple case (same as subtask 2)
		answer = {can[mp(0, adj[0][0])], can[mp(adj[0][0], 0)], 
			can[mp(0, adj[0][1])], can[mp(adj[0][1], 0)], 
			can[mp(adj[0][0], 0)], can[mp(0, adj[0][0])], 
			can[mp(adj[0][1], 0)], can[mp(0, adj[0][1])]};
		return answer;
	}
	if(adj[0].size() == 0)return false;
	// complex case
	int cur = adj[0][0];
	int prev = 0;
	vector<int> beforetrip={ can[mp(prev, cur)] };
	vector<int> aftertrip= { can[mp(prev, cur)] };
	vector<int> trip;
	while(true){
		if(adj[cur].size()==1){
			return false;
		} else if(adj[cur].size()==2){
			if(adj[cur][0]==prev){
				prev = cur;
				cur = adj[cur][1];
			} else{
				prev = cur;
				cur = adj[cur][0];
			}
			beforetrip.pb( can[mp(prev,cur)] );
			aftertrip.pb( can[mp(prev,cur)] );
		} else{
			// we have the trip!
			int A=cur,B,C; // find B,C which are NOT prev
			if(adj[cur][0]==prev){
				B = adj[cur][1];
				C = adj[cur][2];
			} else if(adj[cur][1]==prev){
				B = adj[cur][0];
				C = adj[cur][2];
			} else{
				B = adj[cur][0];
				C = adj[cur][1];
			}
			int AB,BA,AC,CA; // find canoes between AB and AC
			AB = can[mp(A,B)];
			BA = can[mp(B,A)];
			AC = can[mp(A,C)];
			CA = can[mp(C,A)];
			trip = {AB,BA,AC,CA,BA,AB,CA,AC};
			for(int i=0; i<beforetrip.size(); i++){
				answer.pb(beforetrip[i]);
			}
			for(int i=0; i<trip.size(); i++){
				answer.pb(trip[i]);
			}
			for(int i=aftertrip.size()-1; i>-1; i--){
				answer.pb(aftertrip[i]);
			} 
			return answer;
		}
	}
		
	return false;
}
| # | 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... |