Cod sursa(job #34587)

Utilizator crusRus Cristian crus Data 20 martie 2007 21:54:05
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#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;
}