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 "islands.h"
#include <bits/stdc++.h>
#include <variant>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
using ll = int;
using vi = vector<ll>;
using vii = vector<vi>;
using pii = std::pair<ll,ll>;
#define rep(i,j,k) for(ll i=ll(j); i<ll(k); i++)
#define REP(i,j,k) for(ll i=ll(j); i<=ll(k); i++)
#define per(i,j,k) for(ll i=ll(j); i>=ll(k); i--)
#define all(a) a.begin(),a.end()
#define pb emplace_back
#define ln "\n"
struct directed_graph{
  ll N;
  vii edge, revedge;
  vi par;
  vii V;
  directed_graph(vii E){
    N = E.size();
    edge.resize(N);
    revedge.resize(N);
    par.resize(N);
    V.resize(N);
    rep(i,0,N){
      for(auto j: E[i]){
        edge[i].pb(j);
        revedge[j].pb(i);
      }
    }
  }
  vi ord;
  vector<bool> flag;
  void dfs1(ll now){
    flag[now] = true;
    for(auto next: edge[now]){
      if(flag[next]) continue;
      dfs1(next);
    }
    ord.pb(now);
  }
  void dfs2(ll p, ll now){
    flag[now] = true;
    par[now] = p;
    for(auto next: revedge[now]){
      if(flag[next]) continue;
      dfs2(p, next);
    }
  }
  void SCC(){
    flag.resize(N);
    rep(i,0,N){
      if(!flag[i]) dfs1(i);
    }
    reverse(all(ord));
    flag.assign(N,false);
    for(auto el: ord){
      if(!flag[el]){
        dfs2(el,el);
      }
    }
    rep(i,0,N) V[par[i]].pb(i);
  }
};
std::variant<bool, std::vector<int>> find_journey(int N, int M, std::vector<int> U, std::vector<int> V) {
  vii edge(N), index(N);
  rep(i,0,M){
    edge[U[i]].pb(V[i]);
    index[U[i]].pb(i);
  }
  directed_graph G(edge);
  G.SCC();
  {
    std::queue<ll> que;
    que.push(0);
    vi flag(N);
    flag[0] = true;
    while(!que.empty()){
      ll now = que.front(); que.pop();
      if(G.V[G.par[now]].size() >= 2 && edge[now].size() >= 2) return true;
      for(auto next: edge[now]){
        if(flag[next]) continue;
        flag[next] = true;
        que.push(next);
      }
    }
  }
  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... |