Cod sursa(job #2342561)

Utilizator aturcsaTurcsa Alexandru aturcsa Data 12 februarie 2019 21:51:13
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cmath>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q;
int E[500001],ne;
vector <int> A[100001];
int PA[100001],LVL[100001];
int T[500001][30];
void euler(int nod,int l)
{
    T[++ne][0]=nod;
    PA[nod]=ne;
    LVL[nod]=l;
    int ok=1;
    for(auto it:A[nod])
    {
        ok=0;
        euler(it,l+1);
        T[++ne][0]=nod;
    }
}
int main()
{
    fin>>n>>q;
    for(int i=2;i<=n;i++)
    {
        int a;
        fin>>a;
        A[a].push_back(i);
    }
    euler(1,0);
    for(int j=1; (1<<j)<=ne; j++)
    {
        for(int i=1; i+(1<<j)-1<=ne; i++)
            if(LVL[T[i][j-1]]<LVL[T[i+(1<<(j-1))][j-1]])
                T[i][j]=T[i][j-1];
            else
                T[i][j]=T[i+(1<<(j-1))][j-1];
    }
    for(int i=1;i<=q;i++)
    {
        int a,b;
        fin>>a>>b;
        int st,dr;
        st=PA[a];
        dr=PA[b];
        if(st>dr)
            swap(st,dr);
        int diff,k;
        diff=dr-st+1;
        k=log2(diff);
         if(LVL[T[st][k]]<=LVL[T[dr-(1<<k)+1][k]])
            fout<<T[st][k]<<"\n";
        else
            fout<<T[dr-(1<<k)+1][k]<<"\n";
    }
    return 0;
}