Cod sursa(job #3354763)

Utilizator RaduCalisovCalisovRadu RaduCalisov Data 20 mai 2026 12:00:08
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include<bits/stdc++.h>
using namespace std;

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

vector<vector<int>> p;
vector<vector<int>> v;
vector<int> depth;

int LOG;

void dfs(int nod){
    for(int i = 1;i<=LOG;i++){
        p[nod][i] = p[p[nod][i-1]][i-1];

        if(p[nod][i] == 0)
            break;
    }

    for(int i = 0 ; i < v[nod].size();i++){
        int newnod = v[nod][i];

        if(newnod != p[nod][0]){
            depth[newnod] = depth[nod] + 1;
            dfs(newnod);
        }
    }
}

int lca(int a,int b){
    if(depth[a] > depth[b])
        swap(a,b);

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

    for(int i = 0;i<=LOG;i++){
        if(dif & (1<<i))
            b = p[b][i];
    }

    if(a == b)
        return a;

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

    return p[a][0];
}

int main()
{
    int n,q;
    fin>>n>>q;

    int copien = n;
    while(copien){
        LOG++;
        copien/=2;
    }

    p.resize(n+1,vector<int>(LOG+1,0));
    v.resize(n+1);
    depth.resize(n+1);

    depth[1] = depth[0] = 0;

    for(int i=2;i<=n;i++){
        int x;
        fin>>x;
        p[i][0] = x;

        v[i].push_back(x);
        v[x].push_back(i);
    }

    dfs(1);

    for(int i=1;i<=q;i++){
        int a,b;
        fin>>a>>b;

        fout<<lca(a,b)<<"\n";
    }
}