Pagini recente » Cod sursa (job #1513681) | Cod sursa (job #952064) | Cod sursa (job #546873) | Cod sursa (job #604878) | Cod sursa (job #1897386)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int NMAX = 100001;
const int LOGMAX = 20;
int n,x,y;
int dp[LOGMAX][NMAX],memo[NMAX];
short k[NMAX];
int f(int i) {
if(memo[i]!=-1) return memo[i];
short lev=k[i];
for(int p=0;(1<<p)<=lev;p++) {
if((1<<p)&lev)
i=dp[p][i];
}
return 1+f(i);
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++) memo[i]=-1;
for(int i=1;i<=n;i++) {
fin>>k[i];
if(k[i]==0) memo[i]=0;
}
for(int i=1;i<n;i++) {
fin>>x>>y;
dp[0][y]=x;
}
for(int i=1;(1<<i)<=n;i++) {
for(int j=1;j<=n;j++) {
dp[i][j]=dp[i-1][dp[i-1][j]];
}
}
for(int i=1;i<=n;i++) memo[i]=f(i);
for(int i=1;i<=n;i++) fout<<memo[i]<<' ';
return 0;
}