#include "train.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define F first
#define S second
#define sz(x) (int)x.size()
#define pb push_back
const int MAXN=5e3+10;
const ll inf=1e16;
typedef pair<int,int> pii;
int n,m;
vector<int> g[MAXN],charged;
bool z[MAXN],mark[MAXN];
void get(int x){
fall(i,0,n-1) z[i]=0;
queue<int> fila; fila.push(x);
while(!fila.empty()){
auto a=fila.front(); fila.pop();
for(auto u:g[a]){
if(!z[u] && !charged[u]){
z[u]=1;
fila.push(u);
}
}
}
mark[x]=z[x];
}
bool bfs(int x){
fall(i,0,n-1) z[i]=0;
queue<int> fila; fila.push(x); z[x]=1;
while(!fila.empty()){
auto a=fila.front(); fila.pop();
if(mark[a]) return true;
for(auto u:g[a]){
if(!z[u]){
z[u]=1;
fila.push(u);
}
}
}
return false;
}
std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
n=sz(a),m=sz(u);
charged=r;
fall(i,0,m-1) g[u[i]].pb(v[i]);
vector<int> ans(n);
fall(i,0,n-1) if(!r[i]) get(i);
fall(i,0,n-1) ans[i]=(bfs(i)^1);
return ans;
}