Cod sursa(job #2603498)

Utilizator TudorCristeaCristea Tudor TudorCristea Data 20 aprilie 2020 11:26:54
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 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 T[100005];

int AD[100005];

int PAP[100005];

int Euler[100005];

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

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)
    {
        fin >> T[i];
        ADJ[T[i]].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)
    {
        for (j=1;j<=P-(1<<i);++j)
        {
            int L=1<<(i-1);
            table[i][j]=table[i-1][j];
            if (AD[table[i-1][j+L]]<AD[table[i][j]])
            {
                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=AD[table[L][a+LL]];
        }
        fout << Euler[rez] << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}