Cod sursa(job #3338355)

Utilizator IleaIlea Bogdan Ilea Data 2 februarie 2026 19:59:11
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include<iostream>
#include<vector>
using namespace std;

#define NMAX 100001
#define P2MAX 21

int n,q,lg[4*NMAX],rmq[P2MAX][2*NMAX],fap[NMAX],d[NMAX];
vector<int>g[NMAX],euler{0};
auto dfs(int nod,int par)->void{
    d[nod]=1+d[par];
    fap[nod]=euler.size();
    euler.push_back(nod);
    for(auto son:g[nod]){
        if(son==par)continue;
        dfs(son,nod);
        euler.push_back(nod);
    }
}
auto main(void)->signed{
    #ifndef LOCAL
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
    #endif // LOCAL
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    cin>>n>>q;
    for(int i=2;i<=n;++i){
        int x;
        cin>>x;
        g[x].push_back(i);
        // g[i].push_back(x);
    }
    dfs(1,0);
    n=euler.size()-1;
    lg[0]=-1;
    for(int i=1;i<=n;++i){
        rmq[0][i]=euler[i];
        lg[i]=lg[i/2]+1;
    }
    for(int k=1;(1<<k)<=n;++k){
        for(int i=1;i+(1<<k)-1<=n;++i){
            rmq[k][i]=(
                d[rmq[k-1][i]]<d[rmq[k-1][i+(1<<(k-1))]]?
                    rmq[k-1][i]
                        :
                    rmq[k-1][i+(1<<(k-1))]
            );
        }
    }
    for(;q;--q){
        int x,y;
        cin>>x>>y;
        x=fap[x],y=fap[y];
        if(x>y)swap(x,y);
        int l=lg[y-x+1];
        cout<<(
            d[rmq[l][x]]<d[rmq[l][y-(1<<l)+1]]?
                rmq[l][x]
                    :
                rmq[l][y-(1<<l)+1]
        )<<"\n";
    }
    return 0;
}