Cod sursa(job #430659)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 31 martie 2010 11:19:45
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include<cstdio>
#include<vector>
using namespace std;
int tata,u,n,ori,lung,nec[1<<17],str[1<<17],fin[1<<17],Q[1<<17];
bool f[1<<17];
vector<int> L[1<<17];
void dfs(int i)
{
	Q[++u]=i;
	for(vector<int>::iterator it=L[i].begin();it!=L[i].end();it++)
		dfs(*it);
	str[i]=Q[u-nec[i]];
	--u;
}
void inte(int i)
{
	if(str[i]==i)
		return;
	lung++;
	inte(str[i]);
}
int main()
{
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&nec[i]);
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		f[y]=true;
		L[x].push_back(y);
	}
	for(int i=1;i<=n;i++)
		if(f[i]==false)
			tata=i;
	dfs(tata);
	for(int i=1;i<=n;i++)
	{
		lung=0;
		inte(i);
		fin[i]=lung;
	}
	for(int i=1;i<=n;i++)
		printf("%d ",fin[i]);
	return 0;
}