Cod sursa(job #2683971)

Utilizator VladMxPMihaila Vlad VladMxP Data 12 decembrie 2020 12:12:48
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,t,euler[400001],nr,x,y,p;
int h[100001],poz[100001],d[400001][20];
vector<int> v[100001];

void dfs(int nod)
{
    euler[++nr]=nod;
    poz[nod]=nr;
    for(int i=0;i<v[nod].size();i++)
    {
        if(h[v[nod][i]]==0)
        {
            h[v[nod][i]]=h[nod]+1;
            dfs(v[nod][i]);
            euler[++nr]=nod;
        }
    }
}

int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        fin>>t;
        v[t].push_back(i);
    }
    dfs(1);
    for(int i=1;i<=nr;i++)
    {
        d[i][0]=euler[i];
    }
    for(int j=1;(1<<j)<=nr;j++)
    {
        for(int i=1;i+(1<<j)-1<=nr;i++)
        {
            if(h[d[i][j-1]]<h[d[i+(1<<(j-1))][j-1]])d[i][j]=d[i][j-1];
            else d[i][j]=d[i+(1<<(j-1))][j-1];
        }
    }
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        x=poz[x];
        y=poz[y];
        if(y<x)
            swap(x,y);
        p=log2(y-x+1);
        fout<<min(d[x][p],d[y-(1<<p)+1][p])<<'\n';
    }
}