Cod sursa(job #1649764)

Utilizator touristGennady Korotkevich tourist Data 11 martie 2016 14:59:33
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
#define Nmax 100005
#define pb push_back

using namespace std;

int n,lvl[Nmax],l,rmq[2*Nmax][20],Lg[2*Nmax],p[Nmax];
vector <int> L[Nmax];

inline void Dfs(int nod, int tata)
{
    rmq[++l][0]=nod; p[nod]=l;
    for(auto it : L[nod])
    {
        if(it==tata) continue;
        lvl[it]=lvl[nod]+1;
        Dfs(it,nod);
        rmq[++l][0]=nod;
    }
}

inline void RMQ()
{
    int i,j;
    for(j=1;j<20;++j)
        for(i=1;i<=l-(1<<j)+1;++i)
            if(lvl[rmq[i][j-1]]<lvl[rmq[i+(1<<(j-1))][j-1]]) rmq[i][j]=rmq[i][j-1];
            else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];

    for(i=2;i<=l;++i) Lg[i]=Lg[(i>>1)]+1;
}

inline int Lca(int x, int y)
{
    x=p[x]; y=p[y];
    if(x>y) swap(x,y);
    int t=Lg[y-x+1];
    if(lvl[rmq[x][t]]<lvl[rmq[y-(1<<t)+1][t]]) return rmq[x][t];
    return rmq[y-(1<<t)+1][t];
}

int main()
{
    int i,x,m,y;
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    cin>>n>>m;
    for(i=2;i<=n;++i)
    {
        cin>>x;
        L[x].pb(i); L[i].pb(x);
    }
    Dfs(1,0);
    RMQ();
    while(m--)
    {
        cin>>x>>y;
        cout<<Lca(x,y)<<"\n";
    }
    return 0;
}