Cod sursa(job #2555392)

Utilizator stefantagaTaga Stefan stefantaga Data 23 februarie 2020 22:52:37
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

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