Cod sursa(job #2673079)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 15 noiembrie 2020 18:48:36
Problema Cerere Scor 90
Compilator cpp-64 Status done
Runda ursus_retro_fara_alcool Marime 1.02 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int N = 100001;

int n, logN, rez, ans[N], send[N], d[17][N], nod, x;///logN = max 17

void solve();
void find();

int main() {
	fin >> n;
	logN = log2(n);
	for (int i = 1; i <= n; ++i) {
		ans[i] = -1;
		fin >> send[i];
		if (!send[i]) {
			ans[i] = 0;
			d[0][i] = 0;
		}
	}
	int a, b;
	for (int i = 1; i < n; ++i) {
		fin >> a >> b;
		d[0][b] = a;
	}
	for (int pw = 1; pw <= logN; ++pw)
		for (int i = 1; i <= n; ++i)
			d[pw][i] = d[pw - 1][d[pw - 1][i]];
	for (int i = 1; i <= n; ++i) {
		nod = i;
		x = send[i];
		find();
		send[i] = nod;
	}
	for (int i = 1; i <= n; ++i) {
		if (ans[i] == 0) {
			ans[i] = 0;
			fout << "0 ";
			continue;
		}
		rez = 0;
		nod = i;
		solve();
		fout << rez << " ";
	}
}

void solve() {
	while (ans[nod]) {
		++rez;
		nod = send[nod];
	}
}

void find() {
	for (int pw = logN; pw >= 0; --pw)
		if (((1 << pw) & x))
			nod = d[pw][nod];
}