Cod sursa(job #3132714)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 23 mai 2023 18:21:39
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 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[i][u]!=0&&!esteparinte(stramosi[i][u],v))
            u=stramosi[i][u];
    return tata[]
}
void dfs(int nod)
{
    timp++;
    in[nod]=timp;
    stramosi[0][nod]=tata[nod];
    for(int i=1;i<=17;i++)
        stramosi[i][nod]=stramosi[i-1][stramosi[i-1][nod]];
    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;
        int lca=u;
        while(!esteparinte(lca,v))
            lca=tata[lca];
        fout<<lca<<'\n';
    }
    return 0;
}