Cod sursa(job #2368437)

Utilizator cicero23catalin viorel cicero23 Data 5 martie 2019 16:07:49
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#define Nmax 100001
#include <vector>
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[Nmax];
int t[Nmax],first[Nmax],h[2*Nmax],eu[2*Nmax],k,M[2*Nmax][22];
void dfspecial(int x,int H)
{
    eu[++k]=x;
    h[k]=H;
    first[x]=k;
    for(int i=0;i<v[x].size();i++)
    {
        dfspecial(v[x][i],H+1);
        eu[++k]=x;
        h[k]=H;
    }
}
void rmq()
{
    for(int i=1;i<=k;i++)
        M[i][0]=i;
    for(int j=1;(1<<j)<=k;j++)
        for(int i=1;i+(1<<j)-1<=k;i++)
    {
        if(h[M[i][j-1]]<h[M[i+(1<<(j-1))][j-1]]) M[i][j]=M[i][j-1];
        else M[i][j]=M[i+(1<<(j-1))][j-1];
    }
}
int main()
{
    int n,m,i,x,y;
    f>>n>>m;
    for(i=2; i<=n; i++)
        {f>>t[i];
         v[t[i]].push_back(i);
        }
    dfspecial(1,1);
    rmq();
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        x=first[x];
        y=first[y];
        if(y<x) swap(x,y);
        int l=log2(y-x+1);
        if(h[M[x][l]]<h[M[y-(1<<l)+1][l]]) g<<eu[M[x][l]]<<'\n';
        else g<<eu[M[y-(1<<l)+1][l]]<<'\n';
    }
    return 0;
}