Pagini recente » Cod sursa (job #3172231) | Cod sursa (job #3281194) | Cod sursa (job #885165) | Cod sursa (job #2323929) | Cod sursa (job #34587)
Cod sursa(job #34587)
#include <stdio.h>
#define input "cerere.in"
#define output "cerere.out"
#define nmax 100001
long n,i,k[nmax],t[nmax],tata,st[nmax];
struct nod{int v; nod *urm;} *prim[nmax];
void citire()
{
FILE *fin;
long a,b;
nod *q;
fin=fopen(input,"r");
fscanf(fin,"%ld",&n);
for (i=1;i<=n;i++)
fscanf(fin,"%ld",&k[i]);
for (i=1;i<=n;i++) prim[i]=NULL;
for (i=1;i<n;i++)
{
fscanf(fin,"%ld %ld",&a,&b);
t[b]=a;
q=new nod;
q->v=b;
q->urm=prim[a];
prim[a]=q;
}
}
void df(long x)
{
nod *q;
q=prim[st[x-1]];
while (q)
{
st[x]=q->v;
if (k[st[x]]!=0) k[st[x]]=1+k[st[x-k[st[x]]]];
df(x+1);
q=q->urm;
}
}
void solve()
{
for (i=1;i<=n;i++)
if (!t[i]) {tata=i; break;}
st[1]=tata;
df(2);
}
void afisare()
{
FILE *fout;
fout=fopen(output,"w");
for (i=1;i<=n;i++) fprintf(fout,"%ld ",k[i]);
fclose(fout);
}
int main()
{
citire();
solve();
afisare();
return 0;
}