Cod sursa(job #323879)

Utilizator pcinfoCarmen Popescu pcinfo Data 13 iunie 2009 22:50:38
Problema Cerere Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include<cstdio> 
#include <vector>


using namespace std;

int main()
{
	int n,vf,i,j;
	
	freopen("cerere.in","r",stdin);   
	freopen("cerere.out","w",stdout);   
	
	scanf("%d",&n);
	vector<int> viz(n+1,0), urm(n+1,0), p(n+1,0), s(n+1,0), k(n+1,0), tata(n+1,0);
	
	for (i=1;i<=n;i++)
		scanf("%d", &k[i]);
	
	for (i=0;i<n-1;i++)
	{
		scanf("%d %d",&j,&vf);
		tata[vf]=j;
	}
	
	vf=0;
	for (i=1;i<=n;i++)
		if (tata[i]==0)
		{
			vf=i;
			break;
		}
	
	s[1]=vf; urm[1]=0;
	p[vf]=0; 
	vf=1;
	
	while (vf>0)
	{
		i=s[vf];
		j=urm[i]+1;
		while (tata[j]!=i && j<=n)
			j++;
		
		if (j>n)
			vf--;
		else
		{
			urm[i]=j;
			if (viz[j]==0)
			{
				viz[j]=1;
				vf++;
				s[vf]=j;
				urm[j]=0;
				if (k[j]==0)
					p[j]=0;
				else
					p[j]=p[s[vf-k[j]]]+1;
			}
		}
	}
	
	for (i=1;i<=n;i++)
		printf("%d ",p[i]);
	
	return 0;
}