Cod sursa(job #478559)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 19 august 2010 10:12:11
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define pb push_back
#define Nmax 100002

using namespace std;

vector< int > v[Nmax];
queue< int > Q;
int str[17][Nmax];
int K[Nmax],rez[Nmax],gr[Nmax];
int n,rad;

inline int stramos(int p, int x){
	int q;
	while( p>0 ){
		for(q=0; (1<<q)<=p; ++q); --q;
		p -= (1<<q);
		x=str[q][x];
	}
	return x;
}

void parc(){
	vector< int >:: iterator it;
	int f;
	Q.push(rad);
	
	while( !Q.empty() ){
		f=Q.front(); Q.pop();
		
		if( K[f] )
			rez[f]=rez[stramos(K[f],f)]+1;
		
		for(it=v[f].begin(); it!=v[f].end(); ++it)
			Q.push(*it);
	}
}

int main(){
	int i,j,x,y;
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i)scanf("%d",&K[i]);
	for(i=1;i<n;++i){
		scanf("%d%d",&x,&y);
		str[0][y]=x;
		v[x].pb(y); gr[y]++;
	}		
	for(i=1;i<=n;++i) if(!gr[i]){ rad=i; break;}
	
	for(j=1;j<17;++j)
		for(i=1;i<=n;++i)
			str[j][i]=str[j-1][str[j-1][i]];
	
	parc();	

	for(i=1;i<=n;++i) printf("%d ",rez[i]);
	fclose(stdin); fclose(stdout);
	return 0;
}