Pagini recente » Cod sursa (job #2900445) | Cod sursa (job #437817) | Cod sursa (job #2751870) | Cod sursa (job #797799) | Cod sursa (job #750499)
Cod sursa(job #750499)
#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;
}