Cod sursa(job #478557)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 19 august 2010 10:07:28
Problema Cerere Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 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];
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,wh;
	Q.push(rad);
	
	while( !Q.empty() ){
		f=Q.front(); Q.pop();
		
		if( K[f] == 0 ) rez[f]=0;
		else{
			wh=stramos(K[f],f);
			rez[f]=rez[wh]+1;
		}
		
		for(it=v[f].begin(); it!=v[f].end(); ++it)
			if( *it != str[0][f] ) 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) if(!K[i]){ rad=i; break;}
	for(i=1;i<n;++i){
		scanf("%d%d",&x,&y);
		str[0][y]=x;
		v[x].pb(y);
	}		
	
	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;
}