Cod sursa(job #2921331)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 30 august 2022 12:30:36
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>

///#include <tryhard::MODE>

using namespace std;

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

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

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

vector<int>v[NMAX];

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

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

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,x,y,e;
    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;
}