Cod sursa(job #356870)

Utilizator adelinasAdelina Spataru adelinas Data 17 octombrie 2009 11:18:26
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <stdio.h>
#include <stdlib.h>
#define N 100005
int *a[N],b[N][18],f[N],T,ff[N];
int n;
void citire(){
	int i,x,y;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d",&f[i]);
		a[i]=(int*)malloc(4);a[i][0]=0;
	}
	for(i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		b[y][0]=x;
		ff[y]=1;
		a[x][0]++;
		a[x]=(int*)realloc(a[x],(a[x][0]+2)*4);
		a[x][a[x][0]]=y;
	}
	for(i=1;i<=n;i++)
		if(!ff[i]) {
			T=i;
			return;
		}
}
void LCA(){
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=17;j++)
			b[i][j]=-1;
	b[T][0]=-1;
	for(j=1;(1<<j)<=n;j++)
		for(i=1;i<=n;i++)
			if(b[i][j-1]!=-1)
				b[i][j]=b[b[i][j-1]][j-1];
}
int fct(int i){
	int c=0,x=f[i];
	while(x){
		//x/=2;
		if(x%2) i=b[i][c];
		x/=2;
		c++;
	}
	return i;
}
void dfs(int x){
	int i;
	if(f[x])
		//y=fct(x);
		f[x]=1+f[fct(x)];
	for(i=1;i<=a[x][0];i++)
		dfs(a[x][i]);
}
void afisare(){
	for(int i=1;i<=n;i++)
		printf("%d ",f[i]);
}
int main(){
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	citire();
	LCA();
	dfs(T);
	afisare();
	return 0;
}