#include "train.h"
#include <bits/stdc++.h>
using namespace std;
using pi = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
#define bg(x) (x).begin()
#define en(x) (x).end()
#define all(x) bg(x), en(x)
#define sz(x) (int((x).size()))
vi solve(vi a, vi r, vi u, vi v) {
int n = sz(a), m = sz(u);
vvi G(n, vi()), R(n, vi()); for (int i = 0; i < m; i++) G[u[i]].push_back(v[i]), R[v[i]].push_back(u[i]);
vi res(n, 0);
set<int> far;
vi st; for (int i = 0; i < n; i++) if (r[i]) st.push_back(i), far.insert(i);
vi deg1(n); for (int i = 0; i < n; i++) deg1[i] = G[i].size();
while (!st.empty()) {
int u = st.back(); st.pop_back();
for (auto v : R[u]) {
if (far.count(v)) continue;
if (a[v] == 1 || --deg1[v] == 0) {
far.insert(v);
st.push_back(v);
}
}
}
if (far.size() == n) {
return vi(n, 1);
}
vi st2;
set<int> removed; for (int i = 0; i < n; i++) if (!far.count(i)) removed.insert(i), st2.push_back(i);
vi deg2(n); for (int i = 0; i < n; i++) deg2[i] = G[i].size();
while (!st2.empty()) {
int u = st2.back(); st2.pop_back();
for (auto v : R[u]) {
if (removed.count(v)) continue;
if (a[v] == 0 || --deg2[v] == 0) {
removed.insert(v);
st2.push_back(v);
}
}
}
vi a2, r2, u2, v2, id(n, -1), rmap(n, -1);
int cmp = 0;
for (int i = 0; i < n; i++) {
if (removed.count(i)) continue;
a2.push_back(a[i]); r2.push_back(r[i]);
id[i] = cmp++; rmap[cmp-1] = i;
}
for (int i = 0; i < m; i++) {
if (removed.count(u[i]) || removed.count(v[i])) continue;
u2.push_back(id[u[i]]), v2.push_back(id[v[i]]);
}
vi res2 = solve(a2, r2, u2, v2);
for (int i = 0; i < res2.size(); i++) {
res[rmap[i]] = res2[i];
}
return res;
}
vi who_wins(vi a, vi r, vi u, vi v) {
return solve(a, r, u, v);
// int n = sz(a), m = sz(u);
// vi res(n, 0);
// return res;
}