#include "train.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()
vi who_wins(vi a, vi r, vi u, vi v) {
int n=a.size();
int m=u.size();
vector<vi> revgraph(n);
for (int i=0; i<m; i++) {
revgraph[v[i]].pb(u[i]);
}
vi forceable(n,0);
for (int i=0; i<n; i++) {
if (!r[i]) {
vi tin(n);
for (int i=0; i<n; i++) {
if (!a[i]) {
tin[i]=1;
}
else {
tin[i]=revgraph[i].size();
}
}
tin[i]=0;
vi q={i};
while (q.size()) {
auto cur=q.back();
q.pop_back();
for (auto to:revgraph[cur]) {
if (r[to]) {
continue;
}
tin[to]--;
if (tin[to]==0) {
q.pb(to);
}
}
}
if (-tin[i]==revgraph[i].size() || (a[i]==0 && tin[i]<0)) {
forceable[i]=1;
}
}
}
vi tin(n);
vi q;
for (int i=0; i<n; i++) {
if (forceable[i]) {
tin[i]=0;
q.pb(i);
}
else if (!a[i]) {
tin[i]=1;
}
else {
tin[i]=revgraph[i].size();
}
}
vi win(n,1);
while (q.size()) {
auto cur=q.back();
q.pop_back();
win[cur]=0;
for (auto to:revgraph[cur]) {
tin[to]--;
if (tin[to]==0) {
q.pb(to);
}
}
}
return win;
}