Cod sursa(job #3293030)

Utilizator Luca07Nicolae Luca Luca07 Data 10 aprilie 2025 09:59:39
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include<vector>
using namespace std;

#define bsize 20

ifstream cin("lca.in");
ofstream cin("lca.out");

vector<vector<int>> graph;
vector<vector<int>> vparent;
vector<int> depth;

void dfs(int p,int u,int d){
    depth[u]=d;
    for(int i=2;i<bsize;i++){
        vparent[u][i]=vparent[vparent[u][i-1]][i-1];
    }

    for(auto v:graph[u]){
        if(v==p)
            continue;
        dfs(u,v,d+1);
    }
}

int lca(int u,int v){
    if(depth[u]<depth[v])
        swap(u,v);
    int nr=depth[u]-depth[v],i;
    for(i=0;i<bsize;i++){
        if(nr&(1<<i)){
            u=vparent[u][i];
            nr-=(1<<i);
        }
        if(nr==0)
            break;
    }
    if(u==v)
        return u;
    for(i=bsize-1;i>=0;i--){
        if(vparent[u][i]!=vparent[v][i]){
            u=vparent[u][i];
            v=vparent[v][i];
        }
    }
    return vparent[u][0];
}

int main()
{
    int i,j,n,m,u,v;

    cin>>n>>m;
    graph.resize(n+1);
    depth.resize(n+1,0);
    vparent = vector<vector<int>>(n+1,vector<int>(bsize,1));

    for(i=2;i<=n;i++){
        cin>>u;
        vparent[i][0]=u;
        graph[u].push_back(i);
    }

    dfs(-1,1,1);

    for(i=0;i<m;i++){
        cin>>u>>v;
        cout<<lca(u,v)<<"\n";
    }

    return 0;
}