Pagini recente » Cod sursa (job #36028) | Cod sursa (job #2408445) | Cod sursa (job #524677) | Cod sursa (job #1893736) | Cod sursa (job #159697)
Cod sursa(job #159697)
#include <stdio.h>
#define NM 100001
long v[NM],x[NM],n,gr[NM],str[NM];
struct lista{long nod;lista* urm;} *g[NM];
long st[NM],vf;
void dfs(long k)
{lista *p=new lista;
vf++;
st[vf]=k;
str[k]=st[vf-x[k]];//?
for (p=g[k];p;p=p->urm) dfs(p->nod);
vf--;
}
long det(long k)
{long s;
if(x[k]==0) return 0;
s=str[k];
if(v[s]==-1) v[s]=det(s);
return v[s]+1;
}
void add(long a,long b)
{lista *p=new lista;
p->nod=b;
p->urm=g[a];
g[a]=p;
}
int main()
{long i,z,y;
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%ld",&n);
for (i=1;i<=n;i++) v[i]=-1;
for (i=1;i<=n;i++) scanf("%ld",&x[i]);
for (i=1;i<n;i++)
{scanf("%ld %ld",&y,&z);
add(y,z);
gr[z]++;
}
for (i=1;i<=n;i++) if(gr[i]==0) break;
dfs(i);
for (i=1;i<=n;i++) if(v[i]==-1) v[i]=det(i);
for (i=1;i<=n;i++) printf("%ld ",v[i]);
return 0;
}