Cod sursa(job #2443571)

Utilizator GabyD002Dobrita Gabriel GabyD002 Data 28 iulie 2019 16:29:59
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
#define NM 100005
#define pii pair<int,int>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

int n,m,k,lg[4*NM],poz[NM],dp[20][4*NM],dp2[20][4*NM];
vector <pii> v;
vector <int> fii[NM];

void Read();
void Solve();
void Euler(int,int);
void LCA(int,int);
void RMQ();

int main()
{   Read();
    Solve();
    return 0;
}

void Read()
{   f>>n>>m;
    for(int i=2; i<=n; i++)
    {   int x;
        f>>x;
        fii[x].push_back(i);
    }
}

void Solve()
{   Euler(1,0);
    for(int i=2; i<4*NM; i++) lg[i]=lg[i/2]+1;
    RMQ();
    while(m--)
    {   int x,y;
        f>>x>>y;
        LCA(x,y);
    }
}

void RMQ()
{   int l=lg[v.size()];
    for(int i=1; i<=v.size(); i++)
    {   dp[0][i]=v[i-1].second;
        dp2[0][i]=v[i-1].first;
    }
    for(int i=1; i<=l; i++)
        for(int j=1; j<=v.size()-(1<<(i-1)); j++)
        {   if(dp[i-1][j]<dp[i-1][j+(1<<(i-1))])
            {   dp[i][j]=dp[i-1][j];
                dp2[i][j]=dp2[i-1][j];
            }
            else
            {   dp[i][j]=dp[i-1][j+(1<<(i-1))];
                dp2[i][j]=dp2[i-1][j+(1<<(i-1))];
            }
        }
}

void Euler(int nod,int nivel)
{   v.push_back({nod,nivel});
    poz[nod]=v.size();
    for(int i=0; i<fii[nod].size(); i++)
    {   int fc=fii[nod][i];
        Euler(fc,nivel+1);
        v.push_back({nod,nivel});
    }
}

void LCA(int x,int y)
{   int pozX=poz[x],pozY=poz[y];
    int l=lg[pozY-pozX];
    if(pozX>pozY) swap(pozX,pozY);
    if(dp[l][pozX]<dp[l][pozY-(1<<l)+1])
        g<<dp2[l][pozX]<<'\n';
    else
        g<<dp2[l][pozY-(1<<l)+1]<<'\n';
}