Cod sursa(job #1817257)

Utilizator sfechisalin@yahoo.comSfechis Alin [email protected] Data 27 noiembrie 2016 15:48:06
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define MaxN 100001
#define LgMax 20
using namespace std;
vector<int>G[MaxN];
int rmq[LgMax][MaxN<<1],nivel[MaxN<<1],first_pos[MaxN],Euler[MaxN<<1],lg2[MaxN<<1],x,y,k,n,m;
void dfs(int nod,int niv)
{
    Euler[++k]=nod;
    nivel[k]=niv;
    first_pos[nod]=k;
    for(int i=0;i<G[nod].size();++i)
    {
        dfs(G[nod][i],niv+1);
        Euler[++k]=nod;
        nivel[k]=niv;
    }
}
int main()
{
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    fin>>n>>m;
    for(int w,i=2;i<=n;++i)
    {
        fin>>w;
        G[w].push_back(i);
    }
    dfs(1,0);
    lg2[1]=0;
    for(int i=2;i<=k;++i)
        lg2[i]=lg2[i>>1]+1;
    for(int i=1;i<=k;++i)
        rmq[0][i]=i;
    for(int i=1;(1<<i)<=k;++i)
        for(int j=1;j+(1<<i)-1<=k;++j)
        {
            rmq[i][j]=rmq[i-1][j];
            if(nivel[rmq[i-1][j]]>nivel[rmq[i-1][j+(1<<(i-1))]])
                rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
        }
    for(int x,y;m;--m)
    {
        fin>>x>>y;
        int a=first_pos[x],b=first_pos[y];
        if(a>b)
            swap(a,b);
        int k=lg2[b-a+1];
        int  poz=rmq[k][a];
        if(nivel[rmq[k][a]]>nivel[rmq[k][b-(1<<k)+1]])
            poz=rmq[k][b-(1<<k)+1];
        fout<<Euler[poz]<<"\n";
    }
}