Cod sursa(job #3366513)

Utilizator Benjamin4321234Benjamin Secara Benjamin4321234 Data 2 octombrie 2026 11:07:09
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;

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

int n,q,x,y;
vector<int> v[100001];
int depth[100001];
int up[100001][20];

void dfs(int nod, int tata){
    up[nod][0]=tata;
    for(int p=1;p<20;p++){
        up[nod][p]=up[up[nod][p-1]][p-1];
    }
    for(auto u:v[nod]){
        if(u!=tata){
            depth[u]=depth[nod]+1;
            dfs(u,nod);
        }
    }
}

int lift(int a, int nivel){
    for(int i=0;i<=19;i++){
        if(nivel&(1<<i)){
            a=up[a][i];
        }
    }
    return a;
}

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

int main()
{
    fin>>n>>q;
    for(int i=2;i<=n;i++){
        fin>>x;
        v[i].push_back(x);
        v[x].push_back(i);
    }
    depth[1]=1;
    dfs(1,0);
    while(q--){
        fin>>x>>y;
        fout<<lca(x,y)<<'\n';
    }
    return 0;
}