Cod sursa(job #3283232)

Utilizator IleaIlea Bogdan Ilea Data 8 martie 2025 18:08:42
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <vector>
#include <climits>
using namespace std;

#define root 1
int minim=INT_MAX, ind=0, n, m, x, y, fap[100001];
pair<int, int> rmq[33][200001];
vector<int> g[100001];
int eusize=0;
void dfs(int i, int grd=0){
    fap[i]=++eusize;
    rmq[0][eusize]={i, grd};
    for (auto it:g[i]){
        dfs(it, grd+1);
        rmq[0][++eusize]={i, grd};        
    }
}
int lg2[200001];
void rmq_solve(){
    n=eusize;
    lg2[0]=-1;
    for (int i=1; i<=n; ++i){
        lg2[i]=1+lg2[i/2];
    }
    for (int i=1; i<=lg2[n]; ++i){
        for (int j=(1<<i); j<=n; ++j){
            if (rmq[i-1][j].second<rmq[i-1][j-(1<<(-1+i))].second){
                rmq[i][j]=rmq[i-1][j];
            } else {
                rmq[i][j]=rmq[i-1][j-(1<<(i-1))];
            }
            //cout<<rmq[i][j].first<<" ";
        }
        //cout<<endl;
    }
    while (m--){
        int x, y;
        cin>>x>>y;
        x=fap[x], y=fap[y];
        if (x>y)swap(x, y);
        int l=lg2[y-x+1];
        if (rmq[l][x+(1<<l)-1].second<rmq[l][y].second){
            cout<<rmq[l][x+(1<<l)-1].first<<"\n";
        } else {
            cout<<rmq[l][y].first<<"\n";
        }
    }
}
int main(){
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    cin>>n>>m;
    for (int i=2; i<=n; ++i){
        cin>>x;
        g[x].push_back(i);
    }
    dfs(root);
    // for (auto it:euler)cout<<it.first<<" - "<<it.second<<endl;
    // aci vine aint
    // aint_solve();
    // aci vine rmq
    rmq_solve();
    return 0;
}