Cod sursa(job #2213772)

Utilizator unknownpersonBidasca Carina Georgiana unknownperson Data 17 iunie 2018 12:59:12
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int N=100010;
int n,m,i,j,e,p,k,rmq[19][2*N],niv[N],pa[N],E[2*N],x,y,l,st,mi,dr,d;
vector<int> v[N];
void dfs(int,int);
int main()
{
    f>>n>>m;
    for(int i=2;i<=n;i++)
    {
        f>>j;
        v[j].push_back(i);
    }
    dfs(1,1);
    e=18;
    p=1<<e;
    while(p>k)
    {
        e--;
        p>>=1;
    }
    for(i=2;i<=k;i<<=1)
        E[i]=1;
    for(i=2;i<=k;i++)
        E[i]+=E[i-1];
    for(i=1,p=1;i<=e;i++)
        for(st=1,dr=2*p,mi=p+1;dr<=k;st++,mi++,dr++)
            rmq[i][st]=niv[rmq[i-1][st]]<niv[rmq[i-1][mi]]?rmq[i-1][st]:rmq[i-1][mi];
    for(;m;m--)
    {
        f>>i>>j;
        i=pa[i];
        j=pa[j];
        if(i>j)
            swap(i,j);
        d=j-i+1;
        l=E[d];
        p=1<<l;
        x=rmq[l][i];
        y=rmq[l][j-p+1];
        x=(niv[y]<niv[x])?y:x;
        g<<x<<"\n";
    }
    return 0;
}
void dfs(int nod,int nivel)
{
    niv[nod]=nivel;
    rmq[0][++k]=nod;
    pa[nod]=k;
    for(auto vec:v[nod])
    {
        dfs(vec,nivel+1);
        rmq[0][++k]=nod;
    }
}