Cod sursa(job #2822797)

Utilizator francescom_481francesco martinut francescom_481 Data 25 decembrie 2021 16:41:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,x,ceau[200005],prim[200005],niv[200005],q;
vector <int> v[100005];
void dfs(int x,int nivel)
{
    ceau[++q]=x;
    if (prim[x]==0)
    {
        prim[x]=q;
    }
    niv[x]=nivel;
    for (int i=0;i<v[x].size();i++)
    {
        dfs(v[x][i],nivel+1);
        ceau[++q]=x;
    }
}
int rmq[200005][20];
int lca(int x,int y)
{
    if (x==y)
    {
        return x;
    }
    x=prim[x];
    y=prim[y];
    if (x>y)
    {
        swap(x,y);
    }
    int k=log2(y-x);
    if (niv[rmq[y-(1<<k)+1][k]]<niv[rmq[x][k]])
    {
        return rmq[y-(1<<k)+1][k];
    }
    return rmq[x][k];
}
int i,lg,p,j;
int main()
{
    f>>n>>m;
    for (i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }
    dfs(1,1);
    for (i=1;i<=q;i++)
    {
        rmq[i][0]=ceau[i];
    }
    lg=log2(q);
    p=1;
    for (i=1;i<=lg;i++)
    {
        for (j=1;j<=q-p;j++)
        {
            if (niv[rmq[j][i-1]]<niv[rmq[j+p][i-1]])
            {
                rmq[j][i]=rmq[j][i-1];
            }
            else
            {
                rmq[j][i]=rmq[j+p][i-1];
            }
        }
        p=p*2;
    }
    for (i=1;i<=m;i++)
    {
        int x,y;
        f>>x>>y;
        g<<lca(x,y)<<'\n';
    }
    return 0;
}