Cod sursa(job #2117634)

Utilizator SenibelanMales Sebastian Senibelan Data 29 ianuarie 2018 00:28:27
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>
#include <iostream>
#include <vector>
 
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];
vector <int> G[NMAX];
vector <int> start;
 
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];
    int original = node;
    while(order){
        int p = Log2[order];
        node = Ancestor[p][node];
        order = order - (1 << p);
    }
    return node;
}


void DFS(int node, int level){
    results[node] = level;
    for(int i = 0; i < G[node].size(); ++i){
        int neighbour = G[node][i];
        if(results[neighbour] == 0 && V[neighbour] != 0)
            DFS(neighbour, level + 1);
    }
}
 
int Solve(){
    for(int i = 1; i <= N; ++i){
        if(V[i] == 0)
            start.push_back(i);
        else{
            int father = Find(i);
            G[i].push_back(father);
            G[father].push_back(i);
        }
    }
    for(int i = 0; i < start.size(); ++i)
        DFS(start[i], 0);
}

void Print(){
    for(int i = 1; i <= N; ++i)
        out << results[i] << " ";
    out << "\n";
}
 
 
int main(){
    Read();
    Precalculate();
    Solve();
    Print();
    return 0;
}