Cod sursa(job #2480517)

Utilizator PaterucAPetruc Andrei Stefan PaterucA Data 25 octombrie 2019 18:36:33
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;

ifstream inf("lca.in");
ofstream outf("lca.out");

const int N=100010;

int n, m, x, y, i, st, dr, mi, p, P, k, sol;
vector<int> v[N];
int r[20][2*N], pr[N], niv[N];

void dfs(int, int);

int main()
{
    inf>>n>>m;
    for(int i=2; i<=n; i++)
    {
        inf>>x;
        v[x].push_back(i);
        v[i].push_back(x);
    }
    dfs(1,0);
    for(i=1, p=1, P=2; P<=k; i++,p*=2,P*=2)
        for(st=1,mi=p+1,dr=P; dr<=k; st++,mi++,dr++)
            r[i][st]=(niv[r[i-1][st]]<niv[r[i-1][mi]])?r[i-1][st]:r[i-1][mi];
    for(;m;m--)
    {
        inf>>st>>dr;
        st=pr[st];
        dr=pr[dr];
        if(st>dr)
            swap(st,dr);
        i=31-__builtin_clz(dr-st+1);
        p=1<<i;
        dr=dr-p+1;
        sol=(niv[r[i][st]]<niv[r[i][dr]])?r[i][st]:r[i][dr];
        outf<<sol<<'\n';
    }
    return 0;
}

void dfs(int nod, int tata)
{
    niv[nod]=niv[tata]+1;
    r[0][++k]=nod;
    pr[nod]=k;
    for(auto it:v[nod])
        if(it!=tata)
        {
            dfs(it, nod);
            r[0][++k]=nod;
        }
}