Cod sursa(job #2922994)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 10 septembrie 2022 23:32:05
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

ifstream fin ("lca.in");
ofstream fout ("lca.out");

const int NMAX=1e5+5;
const int NMAX1=20;

vector<int>v[NMAX];

int t[NMAX1][NMAX];
int ti[NMAX];
int to[NMAX];
int lev[NMAX];
int kon;

bool ancestor(int x,int y)
{
    return ti[x]<=ti[y] && to[x]>=to[y];
}

void dfs(int x)
{
    ti[x]=++kon;
    for(auto i:v[x])
        dfs(i);
    to[x]=++kon;
}

int lca(int x,int y)
{
    int i,j;
    if(ancestor(x,y))
        return x;
    else
    {
        for(i=lev[x];i>=0;i--)
        {
            if(t[i][x]!=0 && ancestor(t[i][x],y)==0)
                x=t[i][x];
        }
        return t[0][x];
    }
}

int main()
{
    int n,m,i,j,l,e,x,y;
    fin>>n>>m;
    for(i=2;i<=n;i++)
    {
        fin>>t[0][i];
        v[t[0][i]].push_back(i);
    }
    l=(int(log2(n)));
    for(e=1;e<=l;e++)
    {
        for(i=1;i<=n;i++)
        {
            t[e][i]=t[e-1][t[e-1][i]];
            if(t[e][i]!=0)
                lev[i]=e;
        }
    }
    dfs(1);
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<lca(x,y)<<"\n";
    }
    return 0;
}