Cod sursa(job #2603542)

Utilizator TudorCristeaCristea Tudor TudorCristea Data 20 aprilie 2020 12:20:36
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

vector<int> ADJ[100005];

int N,M,P;

int AD[100055];

int PAP[100005];

int Euler[100055];

int table[25][100055],Arr[100055];

void df (int nod,int ad)
{
    ++P;
    Euler[P]=nod;
    AD[P]=ad;
    PAP[nod]=P;
    vector<int> :: iterator it;
    for (it=ADJ[nod].begin();it!=ADJ[nod].end();++it)
    {
        int val=(*it);
        df(val,ad+1);
        ++P;
        Euler[P]=nod;
        AD[P]=ad;
    }
}

int main()
{
    fin >> N >> M;
    int i,j;
    for (i=2;i<=N;++i)
    {
        int x;
        fin >> x;
        ADJ[x].push_back(i);
    }
    df(1,0);
    table[0][1]=1;
    for (i=2;i<=P;++i)
    {
        Arr[i]=Arr[i>>1]+1;
        table[0][i]=i;
    }
    for (i=1;(1<<i)<P;++i)
    {
        int L=1<<(i-1);
        for (j=1;j<=P-(1<<i)+1;++j)
        {
            if(AD[table[i-1][j]]<AD[table[i-1][j+L]])
            {
                table[i][j]=table[i-1][j];
            }
            else
            {
                table[i][j]=table[i-1][j+L];
            }
        }
    }
    for (i=1;i<=M;++i)
    {
        int st,dr;
        fin >> st >> dr;
        int a=PAP[st],b=PAP[dr];
        if (a>b)
        {
            int aux=a;
            a=b;
            b=aux;
        }
        int L=Arr[b-a+1];
        int rez=table[L][a];
        int LL=b-a+1-(1<<L);
        if (AD[rez]>AD[table[L][a+LL]])
        {
            rez=table[L][a+LL];
        }
        fout << Euler[rez] << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}