Cod sursa(job #2858233)

Utilizator Diana_IonitaIonita Diana Diana_Ionita Data 27 februarie 2022 11:57:09
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int i,j,n,m,k,x,y,r,l;
int niv[400005],d[400005][20],e[400005],poz[400005];
vector<int>v[100005];
void dfs(int nod, int nivel)
{
    niv[++k]=nivel;
    e[k]=nod;
    if(!poz[nod])poz[nod]=k;
    for(int i=0; i<v[nod].size(); i++)
    {
        dfs(v[nod][i],nivel+1);
        niv[++k]=nivel;
        e[k]=nod;
    }
}
void rmq()
{
    for(i=1; i<=k; i++)
    {
        d[i][0] = i;
    }
    for(i=1; (1<<i)<=k; i++)
    {
        int l=1<<i;
        for(j=1; l+j<=k; j++)
        {
            if(niv[d[j][i-1]]<niv[d[j+l/2][i-1]])
                d[j][i]=d[j][i-1];
            else d[j][i]=d[j+l/2][i-1];
        }

    }
}
int main()
{
    fin>>n>>m;
    for(i=2; i<=n; i++)
    {
        fin>>x;
        v[x].push_back(i);
    }
    dfs(1,0);
    rmq();
    for(i=1; i<=m; i++)
    {
        fin>>x>>y;
        x=poz[x];
        y=poz[y];
        if(x>y)swap(x,y);
        l=log2(y-x+1);
        if(niv[d[x][l]]<niv[d[y-(1<<l)+1][l]])
            r=d[x][l];
        else r=d[y-(1<<l)+1][l];
        fout<<e[r]<<'\n';
    }
    return 0;
}