Cod sursa(job #2311130)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 2 ianuarie 2019 17:42:30
Problema Cerere Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const int NMax = 100000;

int A[NMax + 5][20], K[NMax + 5], C[NMax + 5], N, x, y;

void Precalc() {
    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]];
}

int Ancestor(int Nod, int O) {
    int k = 0;

    while(O) {
        if(O & 1)
            Nod = A[k][Nod];
        O /= 2, k++;
    }
    return Nod;
}

int Cerere(int Nod) {
    if(C[Nod]) return C[Nod];

    if(!K[Nod]) return 0;

    x = Ancestor(Nod, K[Nod]); y = Cerere(x);

    C[x] = y;

    return 1 + C[x];
}

int main()
{
    fin >> N;

    for(int i = 1; i <= N; i++)
        fin >> K[i];

    for(int i = 1; i < N; i++) {
        fin >> x >> y;

        A[0][y] = x;
    }
    Precalc();

    for(int i = 1; i <= N; i++) {
        if(!C[i])
            C[i] = Cerere(i);

        fout << C[i] << " ";
    }
    fout << '\n';

    fin.close();
    fout.close();

    return 0;
}