Pagini recente » Cod sursa (job #1258297) | Cod sursa (job #1501354) | Cod sursa (job #2267109) | Cod sursa (job #2376133) | Cod sursa (job #2953787)
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
ifstream cin("cerere.in");
ofstream cout("cerere.out");
const int NMAX = 1e5;
vector <int> g[NMAX + 1], fii[NMAX + 1];
bitset <NMAX + 1> viz;
int lift[21][NMAX + 1], dp[NMAX + 1], t[NMAX + 1], k[NMAX + 1], stramos[NMAX + 1], n;
void build(){
for(int i = 1; (1 << i) <= n; i++)
for(int j = 1; j <= n; j++)
lift[i][j] = lift[i - 1][lift[i - 1][j]];
}
void solve(int x, int rad){
int nr = k[x], p = 0, nod = x;
while(nr){
if((nr & 1))
nod = lift[p][nod];
nr >>= 1;
p++;
}
stramos[x] = nod;
dp[x] = 1 + dp[stramos[x]];
}
void dfs(int x, int rad){
solve(x, rad);
for(auto y : fii[x])
dfs(y, rad);
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++)
cin >> k[i];
int x = 0, y = 0;
for(int i = 0; i < n - 1; i++){
cin >> x >> y;
t[y] = x;
fii[x].push_back(y);
}
int rad = 0;
for(int i = 1; i <= n; i++)
if(t[i] == 0)
rad = i;
for(int i = 1; i <= n; i++)
lift[0][i] = t[i];
build();
dfs(rad, rad);
for(int i = 1; i <= n; i++)
cout << --dp[i] << " ";
return 0;
}