Cod sursa(job #3197120)

Utilizator radu._.21Radu Pelea radu._.21 Data 25 ianuarie 2024 18:17:01
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;
vector<int>G[100001];
int k=0,n,m,E[200001],first[100001];
struct abc{
    int nod; int lvl;
}rmq[20][200001];
void dfs(int nod,int level){
    rmq[0][++k]={nod,level};
    first[nod]=k;
    for(auto x : G[nod]){
        dfs(x,level+1);
        rmq[0][++k]={nod,level};
    }
}
ifstream fin("lca.in");
ofstream fout("lca.out");
int main(){
    fin>>n>>m; for(int i=2;i<=n;i++){
        int x; fin>>x;
        G[x].push_back(i);
    }
    dfs(1,1);
    for(int i=2;i<=k;i++)
        E[i]=E[i/2]+1;
    for(int p=1;(1<<p)<=k;p++)
        for(int i=1;i<=k;i++){
            rmq[p][i]=rmq[p-1][i];
        int j = i + (1<<(p-1));
        if(j<=k && rmq[p-1][j].lvl<rmq[p-1][i].lvl)
            rmq[p][i]=rmq[p-1][j];
    }
    while(m--){
        int x,y; fin>>x>>y;
        if(first[x]>first[y])
            swap(x,y);
        x=first[x]; y=first[y];
        int e = E[y-x+1];
        int len =(1<<e);
        if(rmq[e][x].lvl<rmq[e][y-len+1].lvl)
            fout<<rmq[e][x].nod<<'\n';
        else
           fout<<rmq[e][y-len+1].nod<<'\n';
    }
    return 0;
}