Cod sursa(job #2884250)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 2 aprilie 2022 18:48:58
Problema Lowest Common Ancestor Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include<bits/stdc++.h>
using namespace std;
const int NMAX=300005;
int l[NMAX],r[NMAX],viz[NMAX];
vector<int>edge[NMAX];
int cnt=0,k;
int up[NMAX][20];
void dfs(int v,int p)
{
    l[v]=++cnt;
    up[v][0]=p;
    for(int i=1;i<=k;i++)
        up[v][i]=up[up[v][i-1]][i-1];
    for(auto it:edge[v])
        if(it!=p)dfs(it,v);
    r[v]=++cnt;
}
bool is_anc(int u ,int v)
{
    if(l[u]<=l[v] && r[u]>=r[v]) return 1;
    return 0;
}
int lca(int u,int v)
{
    if(is_anc(u,v))return u;
    if(is_anc(v,u))return v;
    for(int i=k;i>=0;--i)
        if(!is_anc(up[u][i],v))
        u=up[u][i];
    return up[u][0];
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    int n,m,nr,i,a,b;
    cin>>n>>m;
    for(i=2;i<=n;i++)
    {
        cin>>nr;
        edge[nr].push_back(i);
    }
    k=ceil(log2(n));
    dfs(1,1);
    for(i=1;i<=m;i++)
    {
        cin>>a>>b;
        cout<<lca(a,b)<<"\n";
    }
}