Cod sursa(job #1674109)

Utilizator oana28Oana Mitoiu oana28 Data 4 aprilie 2016 13:29:50
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#include<vector>
using namespace std;
#define NMAX 100005
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> v[NMAX];
int n,m,x,y,k,d,E[NMAX],N[NMAX],P[NMAX<<1]={-1},D[20][NMAX<<1];
void dfs(int nod, int niv)
{
    D[0][++k]=nod, N[nod]=niv, E[nod]=k;
    for (auto fiu: v[nod])
    {
        dfs(fiu,niv+1);
        D[0][++k]=nod, N[k]=niv;
    }
}
int main()
{
    int i,j;
    fin>>n>>m;
    for (i=2;i<=n;++i)
    {
        fin>>x;
        v[x].push_back(i);
    }
    dfs(1,1);
    for (i=1;i<=k;++i)
        P[i]=1+P[i>>1];
    for (i=1;i<=1+P[k];++i)
        for (j=1;j<=k;++j)
        {
            D[i][j]=D[i-1][j];
            if (j+(1<<(i-1))<=k && N[D[i][j]]>N[D[i-1][j+(1<<(i-1))]])
                D[i][j]=D[i-1][j+(1<<(i-1))];
        }
    for (i=1;i<=m;++i)
    {
        fin>>x>>y;
        x=E[x], y=E[y];
        if (y<x) k=x, x=y, y=k;
        d=P[y-x+1];
        if (N[D[d][x]]<N[D[d][y-(1<<d)+1]])
            fout<<D[d][x]<<"\n";
        else
            fout<<D[d][y-(1<<d)+1]<<"\n";
    }
    return 0;
}