Cod sursa(job #2723140)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 13 martie 2021 16:38:39
Problema Lowest Common Ancestor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;

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

vector<int> G[100005];
int A[30][100005], lg2[100005], nivel[100005];
int n,m,maxnivel;

void dfs(int nod, int tata){
    int i;
    nivel[nod] = nivel[tata]+1;
    maxnivel = max(maxnivel, nivel[nod]);
    for(i = 0 ; i < G[nod].size(); i++){
        dfs(G[nod][i],nod);
    }
}

int LCA(int x, int y){
    if(nivel[x] < nivel[y]){
        swap(x,y);
    }
    while(nivel[x] != nivel[y]){
        x = A[lg2[nivel[x]-nivel[y]]][x];
    }
    if(x==y) return x;
    for(int i = lg2[nivel[x]]; i >= 0; i--){
        if(A[i][x] != A[i][y]){
            x = A[i][x];
            y = A[i][y];
        }
    }
    return A[0][x];
}
int main()
{
    int i,j,a,b;
    fin>>n>>m;
    for(i = 2; i <= n; i++){
        fin>>A[0][i];
        G[A[0][i]].push_back(i);
        lg2[i+1] = lg2[(i+1)/2]+1;
    }
    dfs(1,1);
    for(i = 1; (1<<i) < maxnivel; i++){
        for(j = 1; j <= n; j++){
            A[i][j] = A[i-1][A[i-1][j]];
        }
    }
    for(i = 1; i <= m; i++){
        fin>>a>>b;
        fout<<LCA(a,b)<<'\n';
    }
    return 0;
}