Pagini recente » Cod sursa (job #399875) | Cod sursa (job #3144279) | Cod sursa (job #2126737) | Cod sursa (job #3253267) | Cod sursa (job #1393110)
#include <cstdio>
#include <vector>
using namespace std;
int dest[100001],stiva[150001],s[100001],v[100001];
vector<int> adj[150001];
int n;
void dfs(int nod,int pos)
{
stiva[pos]=nod;
dest[nod]=stiva[pos-v[nod]];
vector<int>::iterator it;
for(it=adj[nod].begin();it!=adj[nod].end();++it) dfs(*it,pos+1);
}
void solve(int nod)
{
if(s[dest[nod]]==-1) solve(dest[nod]);
s[nod]=s[dest[nod]]+1;
}
int main()
{
freopen ("cerere.in","r",stdin);
freopen ("cerere.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&v[i]);
int p1,p2;
for(int i=1;i<n;i++)
{
if(v[i]==0) s[i]=0;
else s[i]=-1;
scanf("%d%d",&p1,&p2);
adj[p1].push_back(p2);
}
if(v[n]==0) s[n]=0;
else s[n]=-1;
dfs(1,1);
for(int i=1;i<=n;i++)
{
if(s[i]==-1) solve(i);
printf("%d ",s[i]);
}
}