Cod sursa(job #2486991)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 3 noiembrie 2019 19:02:03
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>
#define Nmax 100005

using namespace std;

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

int Log2[Nmax], level[Nmax];
int A[60][Nmax];
int n,m;
vector<int> G[Nmax];

int LCA(int x,int y){
    if(level[x] < level[y]){
        swap(x,y);
    }
    while(level[x] != level[y]){
        x = A[Log2[level[x]-level[y]]][x];
    }
    if(x == y) return x;
    for(int k = Log2[level[x]]; k >= 0; k--){
        if(A[k][x] != A[k][y]){
            x = A[k][x];
            y = A[k][y];
        }
    }
    return A[0][x];
}

void dfs(int x,int tata){
    level[x] = level[tata]+1;
    for(int i = 0; i < G[x].size(); i++){
        dfs(G[x][i],x);
    }
}

int main()
{
    int i,a1,a2,j;
    fin>>n>>m;
    for(i = 2; i <= n; i++){
        fin>>A[0][i];
        G[A[0][i]].push_back(i);
        Log2[i] = Log2[i/2]+1;
    }
    dfs(1,0);
    for(i = 1; (1<<i) <= n; i++){
        for(j = 1; j <= n; j++){
            A[i][j] = A[i-1][A[i-1][j]];
        }
    }
    for(i = 1; i <= m; i++){
        fin>>a1>>a2;
        fout<<LCA(a1,a2)<<'\n';
    }
    return 0;
}