Cod sursa(job #633050)

Utilizator Marius96Marius Gavrilescu Marius96 Data 12 noiembrie 2011 21:17:24
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.68 kb
#include<cstdio>
#include<deque>
#include<vector>
#define LEN 100005
using namespace std;

vector<int> v[LEN];
deque<int> d;
bool notroot[LEN];
int k[LEN],s[LEN],ans[LEN];

void dfs(int x){
	s[x]=1;
	d.push_front(x);
	if(k[x])
		ans[x]=ans[d[k[x]]]+1;
	for(int i=0;i<v[x].size();i++)
		if(!s[v[x][i]])
			dfs(v[x][i]);
	d.pop_front();
}

int main(){
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",k+i);
	for(int i=0;i<n-1;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		notroot[y]=1;
		v[x].push_back(y);
	}
	int r;
	for(r=1;r<=n;r++)
		if(!notroot[r])break;
	dfs(r);
	for(int i=1;i<=n;i++)
		printf("%d ",ans[i]);
}