Pagini recente » Cod sursa (job #565322) | Cod sursa (job #2681304) | Cod sursa (job #609177) | Cod sursa (job #2582701) | Cod sursa (job #2657038)
//
// main.cpp
// cerere
//
// Created by Eusbeiu Rares on 09/10/2020.
// Copyright © 2020 Eusebiu Rares. All rights reserved.
//
#include <iostream>
#include "fstream"
const int MV = 1e5 ;
const int LB = 15 ;
const int INF = 1e9 ;
std::fstream in ("cerere.in", std::ios::in) ;
std::fstream out ("cerere.out", std::ios::out) ;
int k[MV + 1] ;
int dp[LB + 1][MV + 1] ;
int sol[MV + 1] ;
int calc(int i, int j) {
int ret(i) ;
for (int lg(0) ; (1 << lg) <= ret ; ++ lg) {
if ((j >> lg) & 1) {
ret = dp[lg][ret] ;
}
}
return ret ;
}
int getBrain(int i) {
if (sol[i] != INF) {
return sol[i] ;
}
int stramos = calc(i, k[i]) ;
return sol[i] = getBrain(stramos) + 1 ;
}
int main(int argc, const char * argv[]) {
int n, i, j, A, B ;
in >> n ;
for (i = 1 ; i <= n ; ++ i) {
in >> k[i] ;
if (k[i] == 0) {
sol[i] = 0 ;
} else {
sol[i] = INF ;
}
}
for (i = 1 ; i <= n - 1 ; ++ i) {
in >> A >> B ;
dp[0][B] = A ;
}
for (i = 1 ; (1 << i) <= n ; ++ i) {
for (j = 1 ; j <= n ; ++ j) {
dp[i][j] = dp[i - 1][dp[i - 1][j]] ;
}
}
for (i = 1 ; i <= n ; ++ i) {
if (sol[i] == INF) {
sol[i] = getBrain(i) ;
}
out << sol[i] << ' ' ;
}
}