Cod sursa(job #3267306)

Utilizator TimurealTimu Ionut Timureal Data 11 ianuarie 2025 10:48:30
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define ll long long
#define nl '\n';
using namespace std;

InParser fin("lca.in");
ofstream fout("lca.out");
const int NMAX=10000+10;

int t[100010];
int adancime[100010];
vector<vector<int>> adj;
void bfs(int start){
    queue<int> q;
    q.push(start);
    adancime[start]=0;
    while(q.size()){
        int nod=q.front(); q.pop();
        for(int i : adj[nod]){
            if(i!=t[nod]){
                adancime[i]=adancime[nod]+1;
                q.push(i);
            }
        }
    }
}

int lca(int a,int b){
    while(a!=b){
        if(adancime[a]<adancime[b]){
            b=t[b];
        }
        else{
            a=t[a];
        }
    }
    return a;
}

int main()
{
    int n , op;
    fin>>n>>op;
    adj.resize(n+1);
    for(int i=2 ;i<=n; i++)
    {
        fin>>t[i];
        adj[t[i]].push_back(i);
    }
    bfs(1);
    while(op--){
        int a , b ;
        fin>>a>>b;
        fout<<lca(a , b)<<nl;
    }
    return 0;
}