Cod sursa(job #2418965)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 7 mai 2019 08:24:52
Problema Cerere Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#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;
}