Cod sursa(job #2706025)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 13 februarie 2021 17:34:40
Problema Lowest Common Ancestor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,dp[100005][21],in[100005],out[100005];
vector<int> muchii[100005];
int t=0;
int level[100005];
void dfs(int nod,int parent)
{
    dp[nod][0]=parent;
    level[nod]=level[parent]+1;
    t++;
    in[nod]=t;
    for(int i=1;i<=20;i++)
        dp[nod][i]=dp[dp[nod][i-1]][i-1];
    for(auto i:muchii[nod])
        dfs(i,nod);
    t++;
    out[nod]=t;
}
bool isparent(int a, int b)
{
    return level[a]<level[b]&&in[a]<in[b]&&out[a]>out[b];
}
int lca(int a, int b)
{
    if(level[a]>level[b])
        swap(a,b);
    if(isparent(a,b))
        return a;
    int p=a;
    for(int i=20;i>=0;i--)
        if(!isparent(dp[p][i],b)&&dp[p][i]>1)
            p=dp[p][i];
    return dp[p][0];
}
int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        int a;
        fin>>a;
        muchii[a].push_back(i);
    }
    dfs(1,0);
    while(m--)
    {
        int a, b;
        fin>>a>>b;
        fout<<lca(a,b)<<'\n';
    }
    return 0;
}