Cod sursa(job #1804146)

Utilizator Bodo171Bogdan Pop Bodo171 Data 12 noiembrie 2016 11:49:25
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
const int nmax=100005;
vector<int> v[nmax];
int rmq[20][2*nmax],first[nmax],lev[nmax],lg[2*nmax];
int unu,doi,n,m,i,j,x,y,a,b,k,niv,dif;
void dfs(int x)
{
    k++;
    first[x]=k;
    rmq[0][k]=x;
    for(int i=0;i<v[x].size();i++)
    {
        lev[v[x][i]]=lev[x]+1;
        dfs(v[x][i]);
        k++;rmq[0][k]=x;
    }
}
void build_rmq()
{
    for(i=2;i<=k;i++)
      lg[i]=lg[i/2]+1;
    for(i=1;(1<<i)<=k;i++)
        for(j=1;j<=k-(1<<i)+1;j++)
    {
        if(lev[rmq[i-1][j]]<lev[rmq[i-1][j+(1<<(i-1))]]) rmq[i][j]=rmq[i-1][j];
        else rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
    }
}
int lca()
{
    unu=first[a];
    doi=first[b];
    if(unu>doi) swap(unu,doi);
    niv=lg[doi-unu+1];
    dif=doi-unu+1-(1<<niv);
    if(lev[rmq[niv][unu]]<lev[rmq[niv][unu+dif]]) return rmq[niv][unu];
    return rmq[niv][unu+dif];
}
int main()
{
    ifstream f("lca.in");
    ofstream g("lca.out");
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
       f>>x;v[x].push_back(i);
    }
    dfs(1);
    build_rmq();
    for(i=1;i<=m;i++)
    {
        f>>a>>b;
        g<<lca()<<'\n';
    }
    return 0;
}