Cod sursa(job #2147405)

Utilizator flibiaVisanu Cristian flibia Data 28 februarie 2018 18:32:22
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.66 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, nr[100100], dp[100100], pv[100100], x, y;

int dfs(int nod, int lvl){
	if(dp[nod] != -1 && lvl == 0)
		return 1 + dp[nod];
	if(lvl == 0 && dp[nod] == -1)
		return 1 + (dp[nod] = dfs(nod, nr[nod]));
	else return dfs(pv[nod], lvl - 1);
}

int main(){
	memset(dp, -1, sizeof dp);
	in >> n;
	for(int i = 1; i <= n; i++){
		in >> nr[i];
		if(!nr[i])
			dp[i] = 0;
	}
	while(in >> x >> y)
		pv[y] = x;
	for(int i = 1; i <= n; i++)
		if(nr[i])
			dp[i] = dfs(i, nr[i]);
	for(int i = 1; i <= n; i++)
		out << dp[i] << ' ';
	return 0;
}