Cod sursa(job #3180685)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 5 decembrie 2023 19:10:26
Problema Cerere Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <iostream>
#define N 100002
std::ifstream fin("cerere.in");
std::ofstream fout("cerere.out");
int Q[N], n, parent[N], dp[N][18], LogN, h[N];
void compute(){  
    for(int i = 1; i <= n; i++){
        dp[i][0] = parent[i];
        for(int k = 1; k < LogN; k++){
            dp[i][k] = dp[dp[i][k - 1]][k - 1];
        }
    }
}
int findAnc(int node, int k){
    for(int j = LogN - 1; j >= 0; j--){
        if((1 << j) <= k){
            node = dp[node][j];
            k -= (1 << j);
        }
    }
    return node;
}
int main(){
    fin >> n;
    while((1 << LogN) <= n){
        LogN ++;
    }
    for(int i = 1; i <= n; i++){
        fin >> Q[i];
    }
    int x, y;
    for(int i = 1; i <= n - 1; i++){
        fin >> x >> y;
        parent[y] = x;
    }
    
    compute();
    for(int i = 1; i <= n; i++){
        if(Q[i] == 0){
            h[i] = 0; continue;
        }
        int qval = Q[i], qi = i, cnt = 0;
        while(qval != 0 ){
            ++cnt; 
            qi = findAnc(qi, qval);
            qval = Q[qi];
        }
        h[i] = cnt;
    }
    for(int i = 1; i <= n; i++){
        fout << h[i] << " ";
    }
}