Cod sursa(job #3253980)

Utilizator iuliageambazuGeambazu Iulia iuliageambazu Data 5 noiembrie 2024 17:34:02
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#pragma GCC optimize("O3", "Ofast", "unroll-loops")
#include <bits/stdc++.h>

using namespace std;

const int NMAX=100000,LOGMAX=20;
int n,m;
vector<int> logg(NMAX+5),level(NMAX+5,0);
vector<vector<int>>anc(NMAX+5, vector<int>(LOGMAX+1));
vector<vector<int>>adj(NMAX+5);

void dfs(int nod)
{
    for(auto vecin:adj[nod])
        if(vecin!=anc[nod][0])
    {
        level[vecin]=level[nod]+1;
        dfs(vecin);
    }
}

int lca(int x, int y)
{
    if(level[x]<level[y])
        swap(x,y);
    while(level[x]!=level[y])
    {
        int k=logg[level[x]-level[y]];
        x=anc[x][k];
    }
    if(x==y)
        return x;
    for(int i=logg[level[x]];i>=0;i--)
    {
        if(anc[x][i]!=anc[y][i])
        {
            x=anc[x][i];
            y=anc[y][i];
        }
    }
    return anc[x][0];
}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        cin>>anc[i][0];
        adj[anc[i][0]].push_back(i);
    }
    dfs(1);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        cout<<lca(x,y)<<'\n';
    }
    return 0;
}