Cod sursa(job #3201517)

Utilizator aaagabiTurbinca Gabriel aaagabi Data 8 februarie 2024 21:28:17
Problema Lowest Common Ancestor Scor 100
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");
typedef long long ll;
int tata[20][100005];
int tin[100005],tout[100005],viz[100005];
vector <int> vec[100005];
int timp;
int n,m;
void dfs(int nod)
{
    timp++;
    viz[nod]=1;
    tin[nod]=timp;
    for(auto x:vec[nod])
        if(!viz[x])
            dfs(x);
    tout[nod]=++timp;
}
bool isancestor(int x,int y)
{
    if(x==0||x==y)
        return 1;
    if(tin[x]<tin[y]&&tout[x]>tout[y])
        return 1;
    return 0;
}
int lca(int x,int y)
{
    if(isancestor(x,y))
        return x;
    if(isancestor(y,x))
        return y;
    for(int i=18;i>=0;i--)
    {
        if(!isancestor(tata[i][x],y))
            x=tata[i][x];
    }
    return tata[0][x];

}
int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;i++)
        fin>>tata[0][i],vec[tata[0][i]].push_back(i);
    for(int i=1;i<=18;i++)
        for(int j=1;j<=n;j++)
            tata[i][j]=tata[i-1][tata[i-1][j]];
    dfs(1);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        fin>>x>>y;
        fout<<lca(x,y)<<'\n';
    }
    return 0;
}