#include "islands.h"
#include <bits/stdc++.h>
#define rep(a,b,c) for(ll a=b; a<c; a++)
#define repr(a,b,c) for(ll a=b-1; a>c-1; a--)
#define repa(a,b) for(auto a:b)
#define ll long long
#define pll pair<ll, ll>
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back
#define mid ((l+r)>>1)
#define ppb pop_back
#define pf push_front
#define all(a) a.begin(),a.end()
using namespace std;
using vi = vector<int>;
template<typename T>
using vec = vector<T>;
const int N=2e5+5;
vec<pii> adj[N];
bool vis[N], vis2[N];
int de[N], n;
deque<int> vans, vans2;
vi a[N], b[N];
bool solve(int u, int p, int e){
	vis[u]=true;
	int c[4]={-1,-1,-1,-1};
	repa(v,adj[u]){
		if(v.se==e) continue;
		if(de[v.se]==u) a[v.fi].pb(v.se);
		else b[v.fi].pb(v.se);
	}
	rep(i,0,n){
		while(a[i].size() && b[i].size()){
			if(c[0]==-1) c[0]=a[i].back(), c[1]=b[i].back();
			else c[2]=a[i].back(), c[3]=b[i].back();
			a[i].ppb();
			b[i].ppb();
		}
		a[i].clear();
		b[i].clear();
	}
	if(min({c[0],c[1],c[2],c[3]})!=-1){
		vans={c[0],c[1],c[2],c[3],c[1],c[0],c[3],c[2]};
		return true;
	}
	repa(v,adj[u]) if(!vis[v.fi] && de[v.se]==u) if(solve(v.fi,u,v.se)){
		vans.pf(v.se);
		vans.pb(v.se);
		return true;
	}
	return false;
}
stack<pii> stk;
bool solve2(int u, int p, int e){
	stk.push({u,e});
	vis[u]=true;
	vis2[u]=true;
	repa(v,adj[u]){
		if(de[v.se]!=u) continue;
		if(!vis[v.fi] && solve2(v.fi,u,v.se)){
			if(stk.size() && stk.top().fi==u){
				stk.pop();
				vans.pf(v.se);
				vans.pb(v.se);
			}
			return true;
		}else if(vis2[v.fi]){
			vans2.pf(v.se);
			while(stk.top().fi!=v.fi){
				vans2.pf(stk.top().se);
				stk.pop();
			}
			repa(e,vans2) vans.pb(e);
			repa(e,vans2) vans.pb(e|1);
			reverse(all(vans2)); 
			repa(e,vans2) vans.pb(e);
			repa(e,vans2) vans.pb(e|1);
			stk.pop();
			return true;
		}
	}
	vis2[u]=false;
	return false;
}
std::variant<bool, std::vector<int>> find_journey(
	int N, int M, std::vector<int> U, std::vector<int> V) {
	vi a, b, ans;
	n=N;
	if(N==2){
		rep(i,0,M){
			if(U[i]==0) a.pb(i);
			else b.pb(i);
		}
		if(a.size()<2 || b.size()<1) return false;
		ans={a[0],b[0],a[1],a[0],b[0],a[1]};
		return ans;
	}
	bool sub1=false;
	rep(i,0,M) adj[U[i]].pb({V[i],i});
	rep(i,0,M) adj[V[i]].pb({U[i],i});
	rep(i,0,M) if((i&1) && U[i]!=U[i-1]) sub1=true;
	rep(i,0,M) de[i]=U[i];
	if(N<=2) return false;
	int c[4]={-1,-1,-1,-1};
	rep(i,0,M){
		if(U[i]==0 && V[i]==1) c[0]=(i);
		if(U[i]==1 && V[i]==0) c[1]=(i);
		if(U[i]==0 && V[i]==2) c[2]=(i);
		if(U[i]==2 && V[i]==0) c[3]=(i);
	}
	ans={c[0],c[1],c[2],c[3],c[1],c[0],c[3],c[2]};
	if(min({c[0],c[1],c[2],c[3]})!=-1)return ans;
	if(sub1 && solve(0,-1,-1)){
		ans.clear();
		repa(e,vans) ans.pb(e);
		return ans;
	}else if(solve2(0,-1,-1)){
		ans.clear();
		repa(e,vans) ans.pb(e);
		return ans;
	}
	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... |