Cod sursa(job #2495735)

Utilizator stefantagaTaga Stefan stefantaga Data 19 noiembrie 2019 19:44:22
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int viz[200005],nr[200005],niv[200005],q,poz[200005];
vector <int> v[200005];
void dfs (int x,int niv1)
{
    int i;
    viz[x]=1;
    for ( i=0; i<v[x].size(); i++)
    {
        int nod=v[x][i];
        if (viz[nod]==0)
        {
            q++;
            nr[q]=x;
            niv[q]=niv1;
            if (poz[x]==0)
            {
                poz[x]=q;
            }
            dfs(nod,niv1+1);

        }
    }
    q++;
    nr[q]=x;
    niv[q]=niv1;
    if (poz[x]==0)
    {
        poz[x]=q;
    }
}
int n,m,i,x,rmq[200005][20],lim,j,y,k;
int main()
{
    f>>n>>m;
    for (i=2; i<=n; i++)
    {
        f>>x;
        v[x].push_back(i);
    }
    dfs(1,1);
    q=2*n-1;
    lim=log2(q);
    for (i=1; i<=q; i++)
    {
        rmq[i][0]=i;
    }
    for (i=1; i<=lim; i++)
    {
        for (j=1; j<=q-(1<<i)+1; j++)
        {
            if (niv[rmq[j][i-1]]>=niv[rmq[j+(1<<(i-1))][i-1]])
            {
                rmq[j][i]=rmq[j+(1<<(i-1))][i-1];
            }
            else
            {
                rmq[j][i]=rmq[j][i-1];
            }
        }
    }
    for (i=1; i<=m; i++)
    {
        f>>x>>y;
        x=poz[x];
        y=poz[y];
        if (x>y)
        {
            swap(x,y);
        }
        if (x==y)
        {
            g<<nr[x]<<'\n';
            continue;
        }
        k=log2(y-x);
        if (niv[rmq[x][k]]>niv[rmq[y-(1<<k)+1][k]])
        {
            g<<nr[rmq[y-(1<<k)+1][k]]<<'\n';
        }
        else
        {
            g<<nr[rmq[x][k]]<<'\n';
        }
    }
    return 0;
}