Pagini recente » Cod sursa (job #497624) | Cod sursa (job #1773914) | Cod sursa (job #1625764) | Cod sursa (job #211049) | Cod sursa (job #2008169)
#include <bits/stdc++.h>
using namespace std;
int n, tt[100005], v[100005], m[100005][20], ans[100005];
bool ok[100005];
vector<int> fii[100005], bunici;
void df(int x)
{
ok[x] = 1;
m[x][0] = tt[x];
int k = 0;
while(m[m[x][k]][k]){
m[x][k+1] = m[m[x][k]][k];
++k;
}
for (vector<int>::iterator it = fii[x].begin(); it != fii[x].end(); ++it)
if(!ok[*it])
df(*it);
}
int pw2(int x)
{
int p = 1, i;
for (i = 0; p <= x; ++i)
p *= 2;
return i-1;
}
int main()
{
ifstream fin ("cerere.in");
ofstream fout ("cerere.out");
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> v[i];
for (int i = 1; i < n; ++i){
int x, y;
fin >> x >> y;
fii[x].push_back(y);
tt[y] = x;
}
for (int i = 1; i <= n; ++i)
if(tt[i] == 0)
bunici.push_back(i);
for (vector<int>::iterator bunic = bunici.begin(); bunic != bunici.end(); ++bunic)
for (vector<int>::iterator it = fii[*bunic].begin(); it != fii[*bunic].end(); ++it)
df(*it);
for (int i = 1; i <= n; ++i)
if(v[i] != 0){
int nod = i, k = 0;
while(v[nod] != 0){
++k;
int y = v[nod];
while(y){
int pw = pw2(y);
y -= (1<<pw);
nod = m[nod][pw];
}
}
ans[i] = k;
}
for (int i = 1; i <= n; ++i)
fout << ans[i] << " ";
fin.close();
fout.close();
return 0;
}