Cod sursa(job #3282932)

Utilizator IleaIlea Bogdan Ilea Data 7 martie 2025 16:14:22
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <vector>
#include <climits>
using namespace std;

#define root 1
int n, m, x, y, fap[100001];
vector<int> g[100001];
pair<int, int> euler[200001];
int eusize=0;
void dfs(int i, int grd=0){
    fap[i]=++eusize;
    euler[eusize]={i, grd};
    for (auto it:g[i]){
        dfs(it, grd+1);
        euler[++eusize]={i, grd};        
    }
}
pair<int, int> aint[100001];
void init(int nod=1, int st=1, int dr=n){
    if (st==dr){
        aint[nod]=euler[st];
        return;
    }    
    int mij=(st+dr)/2;
    init(2*nod, st, mij);
    init(2*nod+1, mij+1, dr);
    aint[nod]=(aint[2*nod].second<aint[2*nod+1].second ? aint[2*nod] : aint[2*nod+1]);
}
int minim=INT_MAX, ind=0;
void query(int nod=1, int st=1, int dr=n){
    if (y<st || dr<x)return;    
    if (x<=st && dr<=y){
        if (minim>aint[nod].second){
            minim=aint[nod].second;
            ind=aint[nod].first;
        }
        return;
    }
    int mij=(st+dr)/2;
    query(2*nod, st, mij), query(2*nod+1, mij+1, dr);
}
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
    n=eusize;
    init();
    while (m--){
        cin>>x>>y;
        x=fap[x], y=fap[y];
        if (x>y)swap(x, y);
        minim=INT_MAX;
        query();
        cout<<ind<<"\n";
    }
    return 0;
}