Cod sursa(job #3247898)

Utilizator luc3lexaAlexandrescu Luca luc3lexa Data 9 octombrie 2024 18:47:14
Problema Cerere Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

const int nmax = 1e5+10;
const int LOG_MAX = 20;

int n;
vector<int> k_value(nmax,0),parent(nmax,0);
vector<vector<int>> up(LOG_MAX,vector<int> (nmax,0));

void read_input(){
	fin >> n;
	for(int i = 1; i <=n; i++){
		fin >> k_value[i];
	};
	int nod_1,nod_2;
	for(int i = 1; i <=n-1; i++){
		fin >> nod_1 >> nod_2;
		parent[nod_2] = nod_1;
	}
};

void precalculare(){
	for(int i = 1; i <=n; i++){
		up[0][i] = parent[i];
	};
	
	for(int j = 1; j <LOG_MAX; j++){
		for(int i = 1; i <=n; i++){
            up[j][i] = up[j-1][up[j-1][i]];
		}
	}
}

int find_ancestor(int nod,int k){
	for(int i = 0; i < LOG_MAX; i++){
		if((1 << i)&k){
			nod = up[i][nod];
		}
	};
	return nod;
}

int solve(int nod){
	int ans = 0;
	for( ;k_value[nod];ans++,nod = find_ancestor(nod,k_value[nod]));
	return ans;
}

int main(){
	read_input();
	precalculare();
	for(int i = 1; i <=n; i++){
		fout << solve(i) << " ";
	}
	return 0;
}