Cod sursa(job #2374982)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 7 martie 2019 21:37:38
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
#define Dim 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N,M,a,b,E[4*Dim],G[Dim],Prim[Dim];
int cnt,xmin,xmax;
int dp[4*Dim][20];
vector <int> V[Dim];

void DFS(int nod,int niv)
{
    E[++cnt]=nod;
    G[cnt]=niv;
    Prim[nod]=cnt;
    for(unsigned int i=0;i<V[nod].size();i++)
    {
        int vecin=V[nod][i];
        DFS(vecin,niv+1);
        E[++cnt]=nod;
        G[cnt]=niv;
    }
}

void RMQ()
{
    for(int i=1;i<=cnt;i++) dp[i][0]=i;
    for(int j=1;(1<<j)<=cnt;j++)
        for(int i=1;i+(1<<j)-1<=cnt;i++)
    if(G[dp[i][j-1]]<G[dp[i+(1<<(j-1))][j-1]])
    dp[i][j]=dp[i][j-1];
    else
    dp[i][j]=dp[i+(1<<(j-1))][j-1];
}

int main()
{
    f>>N>>M;
    for(int i=2;i<=N;i++)
    {
        f>>a;
        V[a].push_back(i);
    }
    DFS(1,0);
    RMQ();
    for(int i=1;i<=M;i++)
    {
        f>>a>>b;
        xmin=min(Prim[a],Prim[b]);
        xmax=max(Prim[a],Prim[b]);
        int dif=log2(xmax-xmin+1);
        if(G[dp[xmin][dif]]<G[dp[xmax-(1<<dif)+1][dif]]) g<<E[dp[xmin][dif]]<<'\n';
        else g<<E[dp[xmax-(1<<dif)+1][dif]]<<'\n';
    }
    return 0;
}