Pagini recente » Cod sursa (job #2218946) | Cod sursa (job #1500535) | Cod sursa (job #1505244) | Cod sursa (job #1035969) | Cod sursa (job #1897345)
#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,mRoot;
int dp[LOGMAX][NMAX],memo[NMAX];
short k[NMAX];
vector<int> G[NMAX];
bitset<NMAX> notRoot;
short 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);
}
void DFS(int i) {
memo[i] = f(i);
for(auto q:G[i]) {
DFS(q);
}
}
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;
notRoot[y]=1;
G[x].push_back(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++) {
if(!notRoot[i])
DFS(i);
}
for(int i=1;i<=n;i++) fout<<memo[i]<<' ';
return 0;
}