Pagini recente » Cod sursa (job #2522404) | Cod sursa (job #2314477) | Cod sursa (job #1802976) | Cod sursa (job #828665) | Cod sursa (job #2147411)
#include <bits/stdc++.h>
using namespace std;
ifstream in("cerere.in");
ofstream out("cerere.out");
int n, nr[100100], dp[100100], pv[100100], anc[20][100100], x, y;
void build(){
int sz = log2(n);
for(int i = 1; i <= n; i++)
anc[0][i] = i;
for(int lvl = 1; lvl <= sz; lvl++)
for(int i = 1; i <= n; i++)
x = anc[lvl - 1][i], anc[lvl][i] = anc[lvl - 1][pv[x]];
}
int solve(int nod, int p){
if(p == 0)
return nod;
int lvl = 0;
while((1 << lvl) - 1 <= p)
lvl++;
lvl--;
if(anc[lvl][nod] == 0)
return 0;
return solve(anc[lvl][nod], p - (1 << lvl) + 1);
}
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(solve(nod, lvl), 0);
}
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;
build();
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;
}