Cod sursa(job #2812123)

Utilizator cdenisCovei Denis cdenis Data 3 decembrie 2021 23:46:00
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

const int MAX=100005;
const int LOG=18;
int n,m,eul[2*MAX],niv[2*MAX],poz[2*MAX],log2[2*MAX],rmq[LOG][2*MAX],k;
vector < int > v[MAX];

void dfs(int vf, int lev)
{
    eul[++k]=vf;
    niv[k]=lev;
    poz[vf]=k;
    for(auto x : v[vf])
    {
        dfs(x,lev+1);
        eul[++k]=vf;
        niv[k]=lev;
    }
}

int main()
{
    fin >> n >> m;
    for(int i=2;i<=n;i++)
    {
        int x;
        fin >> x;
        v[x].push_back(i);
    }
    dfs(1,0);
    log2[1]=0;
    for(int i=2;i<=k;i++)
        log2[i]=log2[i>>1]+1;
    for(int i=1;i<=k;i++)
        rmq[0][i]=i;
    int len=log2[k];
    for(int i=1;i<=len;i++)
    {
        int sf=k-(1<<i)+1;
        int p=1<<(i-1);
        for(int j=1;j<=sf;j++)
        {
            rmq[i][j]=rmq[i-1][j];
            if(niv[rmq[i-1][j+p]]<niv[rmq[i-1][j]])
                rmq[i][j]=rmq[i-1][j+p];
        }
    }
    for(;m;--m)
    {
        int x,y,st,dr,l,dif;
        fin >> x >> y;
        st=poz[x];
        dr=poz[y];
        if(st>dr)
            swap(st,dr);
        l=log2[dr-st+1];
        dif=(1<<l)-1;
        if(niv[rmq[l][st]]<niv[rmq[l][dr-dif]])
            fout << eul[rmq[l][st]] << '\n';
        else
            fout << eul[rmq[l][dr-dif]] << '\n';
    }
    return 0;
}