Cod sursa(job #2972876)

Utilizator Diana_IonitaIonita Diana Diana_Ionita Data 30 ianuarie 2023 16:10:11
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

int rmq[18][100005];
int lvl[300005];
int lg[300005];
int frst[100005],eul[300005],p[300005];
int nr=0;
int n,m;
vector<int>g[100005];
void dfs(int x, int niv)
{
    nr++;
    lvl[nr]=niv;
    frst[x]=nr;
    eul[nr]=x;
    for(int i=0; i<g[x].size(); i++)
    {
        int y=g[x][i];
        dfs(y,niv+1);
        eul[++nr]=x;
        lvl[nr]=niv;
    }
}
void rmq_wow()
{
    for(int i=1; i<=nr; i++)
        rmq[0][i]=i;
    for(int i=2; i<=nr; i++)
        p[i]=p[(i>>1)]+1;

    for(int i=1; (1<<i)<=nr; i++)
        for(int j=1; j<=nr-(1<<i); j++)
        {
            int lg2=1<<(i-1);
            if(lvl[rmq[i-1][j]]<lvl[rmq[i-1][j+lg2]])
                rmq[i][j]=rmq[i-1][j];
            else
                rmq[i][j]=rmq[i-1][j+lg2];
        }
}
int lca_naspa(int x, int y)
{
    x=frst[x];
    y=frst[y];
    if(x>y)swap(x,y);
    int lg2=p[y-x+1],poz;
    if(lvl[rmq[lg2][x]]<lvl[rmq[lg2][y-(1<<lg2)+1]])
        poz=rmq[lg2][x];
    else
        poz=rmq[lg2][y-(1<<lg2)+1];
    return eul[poz];
}
int main()
{
    fin>>n>>m;int i,x,y;
    for(i=2; i<=n; i++)
    {
        fin>>x;
        g[x].push_back(i);

    }
    dfs(1,1);
    rmq_wow();
for(int i=1;i<=m;i++)
{
    fin>>x>>y;
    fout<<lca_naspa(x,y)<<'\n';
}
    return 0;
}