Cod sursa(job #2486175)

Utilizator Dragos1226Dragos Chileban Dragos1226 Data 2 noiembrie 2019 13:36:37
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
/// Aduc x si y la acelasi nivel
/// Urc simultan sa aflu LCA
const int NMax = 100000;
vector <int> G[NMax+5];
int Lvl[NMax+5], N, M, TT[NMax+5], A[20][NMax+5] ,lg[NMax+5];
void Read() {
    in >> N >> M;
    for (int i = 2; i <= N; i++) {
        in >> TT[i];
        G[TT[i]].push_back(i);
    }
    for (int i = 1; i <= N; i++)
        A[0][i] = TT[i];
    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 = 2; i <= N; i++)
        lg[i] = lg[i/2] + 1;
}

void DFS(int Nod) {

    for (auto Vecin : G[Nod])
    {
        Lvl[Vecin] = Lvl[Nod] + 1;
        DFS(Vecin);
    }

}

void LCA(int x,int y) {
    if(Lvl[x] < Lvl[y])
        swap(x,y);
    while(Lvl[x] != Lvl[y]) {
        int k = lg[Lvl[x] - Lvl[y]];
        x = A[k][x];
    }
    if (x==y) {out << x << '\n'; return;}
    for (int k = lg[Lvl[x]]; k >= 0; k--)
        if(A[k][x] != A[k][y]) {
            x = A[k][x];
            y = A[k][y];
        }
    out << A[0][x] << '\n';
}
int main() {
    Read();
    DFS(1);
    int x,y;
    while(M--) {
        in >> x >> y;
        LCA(x,y);
    }
}