#include "train.h"
#include <bits/stdc++.h>
#define fst first
#define snd second
#define pb push_back
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define forn(i,a,b) for(int i = a; i<b;i++)
#define mset(a,v) memset(a,v,sizeof(a))
#ifdef D
#define debug(x) cout<<" (dbgline) "<< x
#else
#define debug(x) // nada
#endif
using namespace std;
typedef long long ll;
const int MAXN = 5000+5;
ll n;
ll A[MAXN];
ll R[MAXN];
bool avble[MAXN];
ll NR[MAXN];
ll RES[MAXN];
vector<ll> adj[MAXN];
vector<ll> radj[MAXN];
void expand(ll t){ //t=1 alcanzan los estaciones de carga
bool vis[n+5];
mset(vis,false);
mset(RES,false);
queue<ll> cola;
debug("Type "<<t<<'\n');
ll cnt[n+5];
forn(i,0,n)if(avble[i]){
if(t){
cnt[i]=0;
for(auto j:adj[i]) if(avble[j]) cnt[i]++;
if(A[i]) cnt[i]=1;
if(R[i]){
cnt[i]=0;
cola.push(i);
}
}else{
cnt[i]=0;
for(auto j:adj[i]) if(avble[j]) cnt[i]++;
if(!A[i]) cnt[i]=1;
if(NR[i]){
cnt[i]=0;
cola.push(i);
}
}
}
while(!cola.empty()){
ll nd = cola.front();
cola.pop();
if(vis[nd]) continue;
vis[nd]=true;
RES[nd]=true;
debug("alcanza "<<nd<<'\n');
for(auto i:radj[nd]) if(avble[i]){
cnt[i]--;
if(cnt[i]==0) cola.push(i);
}
}
}
std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
n=SZ(r);
forn(i,0,SZ(a)) A[i]=a[i];
forn(i,0,SZ(r)) R[i]=r[i];
forn(i,0,SZ(u)){
radj[v[i]].pb(u[i]);
adj[u[i]].pb(v[i]);
}
mset(avble,true);
while(true){
expand(1);
ll cnt = 0;
forn(i,0,n){
if(avble[i] && !RES[i]) NR[i]=true, cnt++;
}
if(!cnt){
vector<int> res;
forn(i,0,n) if(RES[i]){
res.pb(1);
}else res.pb(0);
return res;
}
expand(0);
forn(i,0,n){
if(RES[i]) avble[i]=false;
}
debug("Nueva Iteracion ");
forn(i,0,n) debug(avble[i]<<" "); debug('\n');
}
vector<int> ress;
return ress;
}