Cod sursa(job #1209639)

Utilizator acomAndrei Comaneci acom Data 18 iulie 2014 11:09:51
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 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,k,x,y,l,a,b,P[NMAX<<1],T[NMAX],E[NMAX<<1],N[NMAX<<1],F[NMAX],D[28][NMAX<<1];
void dfs(int s, int niv)
{
    int i;
    E[++k]=s, N[k]=niv;
    if (!F[s]) F[s]=k;
    for (i=0;i<v[s].size();++i)
    {
        dfs(v[s][i],niv+1);
        E[++k]=s, N[k]=niv;
    }
}
int main()
{
    int i,j;
    fin>>n>>m;
    for (i=2;i<=n;++i)
    {
        fin>>T[i];
        v[T[i]].push_back(i);
    }
    dfs(1,1);
    D[0][1]=1;
    for (i=2;i<=k;++i)
        D[0][i]=i, P[i]=1+P[i>>1];
    for (i=1;i<=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=F[x], y=F[y];
        if (x>y) l=x, x=y, y=l;
        l=P[y-x+1];
        a=D[l][x], b=D[l][y+1-(1<<l)];
        if (N[a]<N[b]) fout<<E[a]<<"\n";
        else fout<<E[b]<<"\n";
    }
    return 0;
}