Cod sursa(job #773489)

Utilizator starduststardust stardust Data 1 august 2012 20:16:10
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
#include<fstream>
#include<vector>
#define maxn 100005

using namespace std;

ifstream in("cerere.in");
ofstream out("cerere.out");

vector<int> a[maxn];
int st[maxn],k[maxn],stramos[maxn];

bool uz[maxn],grad[maxn];
int n;

void dfs(int nod,int niv)
{
	st[niv]=nod;
	uz[nod]=1;
	if(k[nod]==0) stramos[nod]=0;
	 else stramos[nod]= st[niv-k[nod]];
	
	for(int i=0;i<a[nod].size();i++)
		if(uz[a[nod][i]]==0) dfs(a[nod][i],niv+1);
}

void read()
{
	in>>n;
	for(int i=1;i<=n;i++)
		in>>k[i];
	int x,y;
	for(int i=1;i<=n-1;i++)
	{
		in>>x>>y;
		a[x].push_back(y);
		grad[y]=1;
	}
}

int main()
{
	read();
	int r;
	for(int i=1;i<=n;i++)
		if(grad[i]==0) 
		   {r=i;break;}
	dfs(r,1);
	
	for(int i=1;i<=n;i++)
	{
		int ans=0;
	  for(int j=stramos[i];j!=0;j=stramos[j],ans+=1);
	  out<<ans<<" ";
	}
}