#include <bits/stdc++.h>
#include "train.h"
using namespace std;
const int N=5001;
vector<int> g[N];
bool vis[N];
bool f[N];
bool lav[N];
bool dfs(int node){
    vis[node]=1;
    bool an=0;
    if(lav[node]){
        return 1;
    }
    for(auto i:g[node]){
        if(vis[i]){
            continue;
        }
        an=an|dfs(i);
    }
    return an;
}
void dfs2(int node,int root){
    vis[node]=1;
    for(auto i:g[node]){
        if(i==root){
            lav[root]=1;
            return;
        }
        if(!vis[i]){
            dfs2(i,root);
        }
    }
}
void dfs3(int node,int root){
    vis[node]=1;
    for(auto i:g[node]){
        if(i==root){
            lav[root]=1;
        }
        if(!vis[i] && !f[i]){
            dfs3(i,root);
        }
    }
}
bool dfs4(int node){
    if(g[node].size()==1){
        if(g[node][0]!=node){
            return dfs4(node-1);
        }
        else{
            return f[node];
        }
    }
    //if(g[node].size()==2){
        if(f[node]^lav[node]){
           return dfs4(node-1); 
        }
        return f[node];
    //}
}
vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
    int n=a.size();
    int m=u.size();
    bool fx=1;
    bool fx2=1;
    for(int i=1;i<=n;++i){
        if(a[i]!=0){
            fx=0;
        }
        if(a[i]!=1){
            fx2=0;
        }
    }
    for(int i=0;i<m;++i){
        g[u[i]].push_back(v[i]);
    }
    for(int i=0;i<n;++i){
        f[i]=r[i];
    }
    if(fx2){
        vector<int> answ;
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                vis[j]=0;
            }
            if(f[i]){
                dfs2(i,i);
            }
        }
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                vis[j]=0;
            }
            answ.push_back(dfs(i));
        }
        return answ;
    }
    if(fx){
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            vis[j]=0;
        }
        if(!f[i]){
            dfs3(i,i);
        }
    }
    vector<int> answ;
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            vis[j]=0;
        }
        answ.push_back(dfs(i)^1);
    }
    return answ;
    }
    for(int i=1;i<=n;++i){
        lav[i]=a[i];
    }
    for(int i=1;i<=n;++i){
        f[i]=r[i];
    }
    vector<int> answ;
    for(int i=1;i<=n;++i){
        answ.push_back(dfs4(i));
    }
    return answ;
}
| # | 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... |