Cod sursa(job #1913195)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 8 martie 2017 12:06:44
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
int m,n;
int E[300002],ap[100002];
int vNiv[300002];
int rmq[300002][50];
int indice=0;
vector <int> A[100002];

void parcurgereEuler(int nod,int niv)
{
    for(vector <int>:: iterator IT=A[nod].begin(); IT!=A[nod].end(); IT++)
    {
        if(!ap[*IT])
            ap[*IT]=indice+1;
        E[++indice]=*IT;
        vNiv[indice]=niv+1;
        parcurgereEuler(*IT,niv+1);
        E[++indice]=nod;
        vNiv[indice]=niv;
    }
}

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

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

    int log=log2(indice);

    for(int i=1; i<=indice; i++)
    {
        rmq[i][0]=i;
    }
    for(int i=1; i<=log; i++)
        for(int j=1; j<=indice; j++)
        {
            rmq[j][i]=rmq[j][i-1];
            if(vNiv[rmq[j][i-1]]>vNiv[rmq[j+(1<<(i-1))][i-1]]&&(j+(1<<(i-1))<=indice))
                rmq[j][i]=rmq[j+(1<<(i-1))][i-1];
        }

    int x,y,st,dr;

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

        st=ap[x];
        dr=ap[y];
        if(st>dr)
            swap(st,dr);

        log=log2(dr-st+1);

        if(vNiv[rmq[st][log]]<vNiv[rmq[dr-(1<<log)+1][log]])
            printf("%d\n",E[rmq[st][log]]);
        else
            printf("%d\n",E[rmq[dr-(1<<log)+1][log]]);
    }
}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    citire();
    /*for(int i=1;i<=indice;i++)
        cout<<E[i]<<" ";
        cout<<endl;
    for(int i=1;i<=indice;i++)
        cout<<vNiv[i]<<" ";
         cout<<endl;
    for(int i=1;i<=m;i++)
            cout<<ap[i]<<" ";
    */
    return 0;
}