Pagini recente » Cod sursa (job #1637435) | Cod sursa (job #1637334) | Cod sursa (job #3327972) | Cod sursa (job #3315027) | Cod sursa (job #3314997)
#include <fstream>
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];
int adj[Nmax],hd[Nmax],nxt[Nmax];
int id=0;
int calcup(int nod)
{
int cur=nod;
for(int i=16;i>=0;i--)
{
if((1<<i)<=k[nod])
{
cur=up[cur][i];
k[nod]-=(1<<i);
}
}
return cur;
}
void addedge(int x,int y)
{
adj[++id]=y;
nxt[id]=hd[x];
hd[x]=id;
}
void dfs(int nod)
{
for(int i=1;i<=16;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 i=hd[nod];i;i=nxt[i]) dfs(adj[i]);
}
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;
addedge(x,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;
}