Cod sursa(job #750499)

Utilizator kryskillerBirsanuc George Cristian kryskiller Data 22 mai 2012 13:47:57
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<stdio.h>
#include<fstream.h>
#define nmax 100001;
#define fmax 100;
long k[nmax], rad,p[nmax],fiu[nmax][fmax],str[20][nmax],min[nmax],n,s[nmax],niv[nmax];
void df(long,long);
void citire(){
	long i,a,b;
	freopen ("cerere.in","r",stdin);
	scanf("%ld", &n);
	for(i=1;i<=n;++i)
		scanf("%ld", &k[i]);
	for(i=1;i<n;++i){
		scanf("%ld%ld", &a,&b);
		p[b]=a;
		fiu[a][++fiu[a][0]]=b;
	}
	for(i=1;i<=n;++i)
		if(!p[i])
			rad=i;
}
void init(){
	long i;
	memset(min,-1,sizeof(min));
	for(i=1;i<=n;++i)
		if(!k[i]) min[i]=0;
	df(rad,0);
	for(i=1;i<=n;++i)
		if(min[i]==-1)
			if(!k[s[i]])
				min[i]=1;
			else str[0][i]=s[i];
}
void df(long x, long n){
	long i;
	niv[n]=x;
	s[x]=niv[n-k[x]];
	for(i=1;i<=fiu[x][0];++i)
		df(fiu[x][i],n+1);
}
void rezolva(){
long d,i;
for(d=11<<d<=n;i++)
	if(min[i]==-1){
		if(min[str[d-1][i]]==-1){
			str[d][i]=str[d-1][str[d-1][i]];
			if(!k[str[d][i]]
				min[i]=( long)1<<d;
		}
		else{
			str[d][i]=str[d-1][str[d-1][i]];
			min[i]=min[str[d-1][i]]+(( long01<<d-1);
		}
	}
}
void afisare(){
	long i;
	freopen ("cerere.out", "w", stdout);
	for(i=1;i<=n;++i)
		printf("%ld", min[i]);
	fclose(stdout);
}
int main(){
	citire();
	init();
	rezolva();
	afisare();
	return 0;
}