Cod sursa(job #3198194)

Utilizator antonio_sefu_tauLaslau Antonio antonio_sefu_tau Data 28 ianuarie 2024 14:54:27
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
const int dim=1e5+5;
int n,q,t[dim],d[dim],bl[20][dim];
bool viz[dim];
vector<int> G[dim];
void bfs(int nod){
    viz[nod]=1;
    queue<int> Q;
    Q.push(nod);
    while(!Q.empty()){
        int x=Q.front();
        Q.pop();
        for(auto u:G[x]){
            if(!viz[u]){
                viz[u]=1;
                d[u]=d[x]+1;
                Q.push(u);
            }
        }
    }
}
void bin_lif(){
    for(int i=1;i<=n;i++){
        bl[0][i]=t[i];
    }
    for(int k=1;k<20;k++){
        for(int i=1;i<=n;i++){
            bl[k][i]=bl[k-1][bl[k-1][i]];
        }
    }
}
int lca(int x, int y){
    if(d[x]<d[y]){
        swap(x,y);
    }
    for(int k=19;k>=0;k--){
        if(d[x]-(1<<k)>=d[y]){
            x=bl[k][x];
        }
    }
    if(x==y){
        return x;
    }
    for(int k=19;k>=0;k--){
        if(bl[k][x] and bl[k][y] and bl[k][x]!=bl[k][y]){
            x=bl[k][x];
            y=bl[k][y];
        }
    }
    return t[x];
}
int main(){
    ifstream f("lca.in");
    ofstream g("lca.out");
    f>>n>>q;
    for(int i=1;i<n;i++){
        int x;
        f>>x;
        t[i+1]=x;
        G[i+1].push_back(x);
        G[x].push_back(i+1);
    }
    bfs(1);
    bin_lif();
    while(q--){
        int x,y;
        f>>x>>y;
        g<<lca(x,y)<<'\n';
    }
    return 0;
}