Cod sursa(job #3132743)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 23 mai 2023 18:57:51
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m;
int tata[100005];
vector<int> muchii[100005];
int in[100005],out[100005];
int timp;
int stramosi[100005][21];
bool esteparinte(int u,int v)
{
    if(in[u]<=in[v]&&out[u]>=out[v])
        return 1;
    return 0;
}
int LCA(int u,int v)
{
    if(esteparinte(u,v))
        return u;
    if(esteparinte(v,u))
        return v;
    for(int i=17;i>=0;i--)
        if(stramosi[u][i]!=0&&!esteparinte(stramosi[u][i],v))
            u=stramosi[u][i];
    return tata[u];
}
void dfs(int nod)
{
    timp++;
    in[nod]=timp;
    stramosi[nod][0]=tata[nod];
    for(int i=1;i<=17;i++)
        stramosi[nod][i]=stramosi[stramosi[nod][i-1]][i-1];
    for(int i:muchii[nod])
        if(i!=tata[nod])
            dfs(i);
    out[nod]=timp;
}
int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        fin>>tata[i];
        muchii[i].push_back(tata[i]);
        muchii[tata[i]].push_back(i);
    }
    dfs(1);
    while(m--)
    {
        int u,v;
        fin>>u>>v;
        fout<<LCA(u,v)<<'\n';
    }
    return 0;
}