Cod sursa(job #1568754)

Utilizator ZimmyZimmermann Erich Zimmy Data 14 ianuarie 2016 18:08:06
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector<int> E[20],v[100010];
int n,m,i,j,k,p,P,q,Q,a,b,niv[100010],pr[100010];
void dfs(int,int);
int main()
{
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>j;
        v[j].push_back(i);
    }
    dfs(1,0);
    for(i=0,j=1,p=1,P=2;P<k;i++,j++,p<<=1,P<<=1)
    {
        Q=k-P+1;
        for(q=0;q<Q;q++)
        {
            a=E[i][q];
            b=E[i][q+p];
            if(niv[a]>niv[b])
                a=b;
            E[j].push_back(a);
        }
    }
    for(;m;m--)
    {
        f>>a>>b;a=pr[a];b=pr[b];
        if(a>b)swap(a,b);
        j=(int)log2((double)(b-a+1));
        p=1<<j;
        a=E[j][a];
        b=E[j][b-p+1];
        if(niv[a]>niv[b])a=b;
        g<<a<<'\n';
    }
    return 0;
}
void dfs(int nod,int nivel)
{
    E[0].push_back(nod);pr[nod]=k++;
    niv[nod]=nivel;
    for(auto it:v[nod])
    {
        dfs(it,nivel+1);E[0].push_back(nod);k++;
    }
}