#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 who_wins(vi a, vi r, vi u, vi v) {
int n = sz(a), m = sz(u);
vvi G(n), R(n); for (int i = 0; i < m; i++) G[u[i]].push_back(v[i]), R[v[i]].push_back(u[i]);
bitset<5000> alive; for (int i = 0; i < n; i++) alive.set(i);
auto find_all = [&](int owner, set<int> &base) {
vi deg(n);
for (int i = alive._Find_first(); i < n; i = alive._Find_next(i)) {
for (auto v : R[i]) {
if (!alive[v]) continue;
deg[v]++;
}
}
set<int> r;
vector<int> st; for (auto &x : base) st.push_back(x), r.insert(x);
while (!st.empty()) {
int u = st.back(); st.pop_back();
for (auto v : R[u]) {
if (!alive[v]) continue;
if (r.count(v)) continue;
if (a[v] == owner || --deg[v] == 0) st.push_back(v), r.insert(v);
}
}
return r;
};
vi res(n, 1); set<int> ar; for (int i = 0; i < n; i++) if (r[i] == 1) ar.insert(i);
while (true) {
set<int> far = find_all(1, ar);
if (far.size() == alive.count()) break;
set<int> x; for (int i = alive._Find_first(); i < n; i = alive._Find_next(i)) if (!far.count(i)) x.insert(i);
set<int> fbr = find_all(0, x);
for (auto &u : fbr) alive[u] = 0, res[u] = 0, ar.erase(u);
}
return res;
}