Pagini recente » Cod sursa (job #589223) | Cod sursa (job #1790683) | Cod sursa (job #1740608) | Cod sursa (job #3303661) | Cod sursa (job #3314991)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int Nmax=1e5+5;
int up[Nmax][20];
int ans[Nmax],k[Nmax];
vector<int> g[Nmax];
int calcup(int nod)
{
int cur=nod;
for(int i=17;i>=0;i--)
{
if((1<<i)<=k[nod])
{
cur=up[cur][i];
k[nod]-=(1<<i);
}
}
return cur;
}
void dfs(int nod)
{
for(int i=1;i<=17;i++) up[nod][i]=up[up[nod][i-1]][i-1];
if(k[nod]==0)
{
ans[nod]=0;
}
else
{
int prv=calcup(nod);
ans[nod]=ans[prv]+1;
}
for(int u:g[nod]) dfs(u);
}
int main()
{
int n;
fin>>n;
for(int i=1;i<=n;i++) fin>>k[i];
for(int i=1;i<n;i++)
{
int x,y;
fin>>x>>y;
g[x].push_back(y);
up[y][0]=x;
}
int R;
for(int i=1;i<=n;i++) if(up[i][0]==0) R=i;
up[R][0]=R;
dfs(R);
for(int i=1;i<=n;i++) fout<<ans[i]<<' ';
return 0;
}