Cod sursa(job #1911031)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 7 martie 2017 19:12:46
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int m,n,vTati[100002];
int E[400002];
int vNiv[400002][100];
int indice=0;
int findINe(int nod)
{
    for(int i=1; i<=indice; i++)
    {
        if(E[i]==nod)
            return i;
    }
}
void parcurgereEuler(int nod,int niv)
{
    for(int i=1; i<=m; i++)
    {
        if(vTati[i]==nod)
        {
            E[++indice]=i;
            vNiv[indice][0]=niv+1;
            parcurgereEuler(i,niv+1);
            E[++indice]=nod;
            vNiv[indice][0]=niv;
        }
    }
}

void citire()
{
    scanf("%d%d",&m,&n);
    for(int i=2; i<=m; i++)
    {
        scanf("%d",&vTati[i]);
    }

    E[++indice]=1;
    vNiv[indice][0]=0;
    parcurgereEuler(1,0);

    int log=log2(indice);

    for(int i=1; i<=log; i++)
        for(int j=1; j<=m; j++)
        {
            if(j+(1<<(i-1))>m)
                vNiv[j][i]=vNiv[j][i-1];
            else
                vNiv[j][i]=min(vNiv[j][i-1],vNiv[j+(1<<(i-1))][i-1]);
        }

    int x,y,st,dr;

    for(int i=1; i<=n; i++)
    {
        scanf("%d%d",&x,&y);

        st=findINe(x);
        dr=findINe(y);
        if(st>dr)
            swap(st,dr);

        log=log2(dr-st+1);
        int aux=min(vNiv[st][log],vNiv[dr-(1<<log)+1][log]);

        for(int i=st;i<=dr;i++)
        {
            if(vNiv[i][0]==aux)
            {
                printf("%d\n",E[i]);
                break;
            }
        }
    }
}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    citire();
    return 0;
}