Cod sursa(job #3361629)

Utilizator TianaInfoLitcanu Tiana TianaInfo Data 26 iulie 2026 19:55:35
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");
#define cin fin
#define cout fout
int n,m,up[100005][18],nivel[100005],x,y;

int lca(int a,int b)
{
    if(nivel[a]<nivel[b])
        swap(a,b);

    int dif=nivel[a]-nivel[b];

    for(int i=17;i>=0;i--)
        if(dif&(1<<i)) a=up[a][i];

    if(a==b) return a;

    for(int i=17;i>=0;i--)
        if(up[a][i]!=up[b][i])
        {
            a=up[a][i];
            b=up[b][i];
        }

    return up[a][0];
}

int main()
{
    cin>>n>>m;

    up[1][0]=1;
    nivel[1]=0;

    for(int i=2;i<=n;i++)
    {
        cin>>up[i][0];
        nivel[i]=nivel[up[i][0]]+1;

        for(int j=1;j<=17;j++)
            up[i][j]=up[up[i][j-1]][j-1];
    }

    while(m--)
    {
        cin>>x>>y;
        cout<<lca(x,y)<<'\n';
    }
}