Cod sursa(job #3211395)

Utilizator radu._.21Radu Pelea radu._.21 Data 9 martie 2024 11:19:03
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n,m,first[200001],E[200001];
ifstream fin("lca.in");
ofstream fout("lca.out");
struct abc{
    int nod; int lvl;
}r[20][200001];
int k = 0;
vector<int>G[200001];
void dfs(int nod,int lvl){
    r[0][++k]={nod,lvl};
    first[nod]=k;
    for(auto x : G[nod])
    {
        dfs(x,lvl+1);
        r[0][++k]={nod,lvl};
    }
}
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++){
            r[p][i]=r[p-1][i];
            int j = i +(1<<(p-1));
            if(j<=k && r[p-1][j].lvl<r[p-1][i].lvl)
                r[p][i]=r[p-1][j];
        }
    while(m--){
        int st,dr; fin>>st>>dr;
        if(first[st]>first[dr])
            swap(st,dr);
        st = first[st];
        dr = first[dr];
        int e = E[dr-st+1];
        int len = (1<<e);
        if(r[e][st].lvl<r[e][dr-len+1].lvl)
            fout<<r[e][st].nod<<'\n';
        else
            fout<<r[e][dr-len+1].nod<<'\n';
    }
    return 0;


}