Cod sursa(job #2117501)

Utilizator SenibelanMales Sebastian Senibelan Data 28 ianuarie 2018 21:44:10
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const int NMAX = 100005;
int N;
int T[NMAX], V[NMAX];
int Ancestor[20][NMAX];
int Log2[NMAX];
int results[NMAX];

void Read(){
    in >> N;
    for(int i = 1; i <= N; ++i)
        in >> V[i];
    for(int i = 1; i <= N - 1; ++i){
        int a, b;
        in >> a >> b;
        T[b] = a;
        Ancestor[0][b] = a;
    }
}

void Precalculate(){
    for(int i = 2; i <= N; ++i)
        Log2[i] = Log2[i / 2] + 1;
    for(int i = 1; (1 << i) <= N; ++i)
        for(int j = 1; j <= N; ++j)
            Ancestor[i][j] = Ancestor[i - 1][Ancestor[i - 1][j]];
}

int Find(int node){
    int order = V[node];
    while(order){
        int p = Log2[order];
        node = Ancestor[p][node];
        order = order - (1 << p);
    }
    return node;
}

int Solve(int node){
    if(V[node] == 0)
        return 0;
    int sol, to_go = Find(node);
    if(!results[to_go])
        Solve(to_go); 
    sol = 1 + results[to_go];
    results[node] = sol;
    return sol;
}

void Print(){
    for(int i = 1; i <= N; ++i){
        if(!results[i])
            Solve(i);
        out << results[i] << " ";
    }
    out << "\n";
}


int main(){
    Read();
    Precalculate();
    Print();
    return 0;
}