Cod sursa(job #2001076)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 15 iulie 2017 16:57:13
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector<int> v[100010];
int n,m,lg,st,mi,dr,i,x,y,k,lev[100010],pa[100010],rmq[20][200030];
void euler(int nod)
{
    rmq[0][++k]=nod;
    pa[nod]=k;
    for(auto it:v[nod])
    {
        lev[it]=lev[nod]+1;
        euler(it);rmq[0][++k]=nod;
    }
}
int main()
{
    f>>n>>m;lev[1]=1;
    for(i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }euler(1);
    for(i=1,lg=2;lg<=k;i++,lg<<=1)
        for(st=1,mi=lg/2+1,dr=lg;dr<=k;st++,mi++,dr++)
        {
            int ns=rmq[i-1][st],nm=rmq[i-1][mi];
            rmq[i][st]=lev[ns]<lev[nm]?ns:nm;
        }
    for(;m;m--)
    {
        f>>x>>y;
        x=pa[x];y=pa[y];
        if(x>y)swap(x,y);
        int lin=31-__builtin_clz(y-x+1);
        lg=1<<lin;x=rmq[lin][x];
        y=rmq[lin][y-lg+1];
        g<<(lev[x]<lev[y]?x:y)<<'\n';
    }
    return 0;
}