Cod sursa(job #341998)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 20 august 2009 12:30:06
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<cstdio>
#define N 100001
int n,num,d[N],x[N],y[N],st[N],u,*a[N];
bool b[N];
struct cerere{int t,c;}v[N];
void completez(int x)
{
	if (!v[x].t)
		v[x].c=0;
	else
	{
		int cx=x,num=0,cu=u;
		while (v[cx].t)
		{
			int g=v[cx].t;
			cu=cu-g+1;
			cx=st[cu];
			++num;
			--cu;
		}
		v[x].c=num;
	}
}
void dfs(int x)
{
	
	for (int i=1; i<=a[x][0]; ++i)
	{
		if (a[a[x][i]][0])
		{
			completez(a[x][i]);
			st[++u]=a[x][i];
			dfs(st[u]);
			--u;
		}
		else
		{
			completez(a[x][i]);
		}
	}
}
void citire()
{
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	scanf("%d",&n);
	for (int i=1; i<=n; ++i)
		scanf("%d",&v[i].t);
	for (int i=1; i<n; ++i)
	{
		scanf("%d%d",&x[i],&y[i]);
		++d[x[i]];
		b[y[i]]=true;
	}
	for (int i=1; i<=n; ++i)
	{
		a[i]=new int [1+d[i]];
		a[i][0]=0;
	}
	for (int i=1; i<n; ++i)
		a[x[i]][++a[x[i]][0]]=y[i];
	for (int i=1; i<=n; ++i)
		if (!b[i])
		{
			st[++u]=i;
			dfs(i);
			return;
		}
	
}
void afis()
{
	for (int i=1; i<=n; ++i)
	{
		/*printf("%d ",i);
		for (int j=1; j<=a[i][0]; ++j)
			printf("%d ",a[i][j]);
		printf("\n");*/
		printf("%d ",v[i].c);
	}
}
int main()
{
	citire();
	afis();
	return 0;
}