Cod sursa(job #2657038)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 9 octombrie 2020 16:02:31
Problema Cerere Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
//
//  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] << ' ' ;
	}
}