Cod sursa(job #2951005)

Utilizator bostanlucastefanBostan Luca-Stefan bostanlucastefan Data 5 decembrie 2022 09:38:59
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
#define pb push_back

using namespace std;

const int N=1e5+5;
const int L=17;

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

int n,m,niv[N],up[N][L+1];
vector<int> g[N];

void dfs(int nod,int tata){
    for(int i=1; i<=L; i++)
        up[nod][i]=up[up[nod][i-1]][i-1];
    for(auto i:g[nod])
        if(i!=tata){
            niv[i]=niv[nod]+1;
            up[i][0]=nod;
            dfs(i,nod);
        }
}

int lca(int a,int b){
    if(niv[a]<niv[b])
        swap(a,b);
    for(int i=L; i>=0; i--)
        if(up[a][i] && niv[up[a][i]]>=niv[b])
            a=up[a][i];
    if(a==b)
        return a;
    for(int i=L; i>=0; i--)
        if(up[a][i] && up[b][i] && up[a][i]!=up[b][i])
        {
            a=up[a][i];
            b=up[b][i];
        }
    return up[a][0];
}

int main()
{
    fin>>n>>m;
    for(int i=2; i<=n; i++)
    {
        int x;
        fin>>x;
        g[x].pb(i);
        g[i].pb(x);
    }
    dfs(1,0);
    for(int i=1; i<=m; i++)
    {
        int a,b;
        fin>>a>>b;
        fout<<lca(a,b)<<'\n';
    }
}