Cod sursa(job #2581680)

Utilizator RedXtreme45Catalin RedXtreme45 Data 15 martie 2020 17:02:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#define Nmax 100010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,pap[Nmax],nr;
pair<int,int> dp[20][2*Nmax];
bool ap[Nmax];
vector <int> G[Nmax];
void DFS(int start,int adan)
{
    dp[0][++nr].first=start;
    dp[0][nr].second=adan;
    if (ap[start]==0)
        ap[start]=1,pap[start]=nr;
    for (auto i:G[start])
    {
        DFS(i,adan+1);
        dp[0][++nr].first=start;
        dp[0][nr].second=adan;
    }
}
void RMQ()
{
    int x=0,o=2*n,i,j;
    while ((1<<x)<=o)
        x++;
    for (i=1;i<x;i++)
        for (j=1;j<=o-(1<<i)+1;j++)
        {
            dp[i][j]=dp[i-1][j];
            if (dp[i][j].second>dp[i-1][j+(1<<(i-1))].second)
                dp[i][j]=dp[i-1][j+(1<<(i-1))];
        }
}
int main()
{
    int i,a,b;
    fin>>n>>m;
    for (i=1;i<n;i++)
    {
        fin>>a;
        G[a].push_back(i+1);
    }
    DFS(1,0);
    RMQ();
    for (i=1;i<=m;i++)
    {
        fin>>a>>b;
        int a1=min(pap[a],pap[b]),b1=max(pap[a],pap[b]);
        int l=b1-a1+1,x=0;
        while ((1<<x)<=l)
            x++;
        x--;
        pair<int,int> max1;
        max1=dp[x][a1];
        if (max1.second>dp[x][b1-(1<<x)+1].second)
            max1=dp[x][b1-(1<<x)+1];
        fout<<max1.first<<"\n";
    }
    return 0;
}