Pagini recente » Cod sursa (job #112379) | Cod sursa (job #2710798) | Istoria paginii runda/wettbewerbssimulation2 | Cod sursa (job #1836426) | Cod sursa (job #2418965)
#include <fstream>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int NMax = 100000;
int N, K[NMax + 5], DP[NMax + 5], A[25][NMax + 5];
int Stramos(int Nod, int P)
{
int k = 0;
while(P)
{
if(P & 1) Nod = A[k][Nod];
P >>= 1, k++;
}
return Nod;
}
int Solve(int i)
{
if(DP[i] != -1) return DP[i];
DP[i] = 1 + Solve(Stramos(i, K[i]));
return DP[i];
}
int main()
{
fin >> N;
for(int i = 1; i <= N; i++)
fin >> K[i], DP[i] = (K[i] == 0) ? 0 : -1;
for(int i = 1, a, b; i < N; i++)
fin >> a >> b, A[0][b] = a;
for(int i = 1; (1 << i) <= N; i++)
{
for(int j = 1; j <= N; j++)
A[i][j] = A[i - 1][A[i - 1][j]];
}
for(int i = 1; i <= N; i++)
{
if(DP[i] == -1)
Solve(i);
}
for(int i = 1; i <= N; i++)
fout << DP[i] << " ";
fout << '\n';
fin.close();
fout.close();
return 0;
}