Pagini recente » Cod sursa (job #65661) | Cod sursa (job #2659216) | Cod sursa (job #1220991) | Cod sursa (job #2110524) | Cod sursa (job #369114)
Cod sursa(job #369114)
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("cerere.in");
ofstream fo("cerere.out");
vector<int> G[100010];
int K[100010],rez[100010],st[100010][20],dst[100010],vf=1,N,x,y;
char is[100010];
void dfs(int nod){
for (int i=0,vl=1;(1<<i)<=vf;++i,vl*=2) st[nod][i]=dst[vf-vl+1];
if (K[nod]){
int an=nod,str=K[nod],pw=18;
while (str){
while ((1<<pw)>str)--pw;
an=st[an][pw];
str-=(1<<pw);
}
rez[nod]=rez[an]+1;} else rez[nod]=0;
dst[++vf]=nod;
for (unsigned int i=0;i<G[nod].size();++i) dfs(G[nod][i]);
--vf;
}
int main(){
fi>>N;
for (int i=1;i<=N;++i) fi>>K[i];
for (int i=1;i<N;++i){
fi>>x>>y;
G[x].push_back(y);
++is[y];
}
for (int i=1;i<=N;++i) if (!is[i])dfs(i);
for (int i=1;i<=N;++i) fo<<rez[i]<<" ";
fo<<"\n";fo.close();
return 0;
}