Cod sursa(job #1127395)

Utilizator rares96cheseliRares Cheseli rares96cheseli Data 27 februarie 2014 12:19:48
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define Nmax 100002
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

int N, M, F[Nmax], RMQ[20][2*Nmax], E[2*Nmax], L[Nmax], lg[2*Nmax], x, y;
vector <int> G[Nmax];

void dfs(int nod, int level)
{
    L[nod]=level; E[++E[0]]=nod; F[nod]=E[0];
    vector <int>::iterator it=G[nod].begin();
    for (; it!=G[nod].end(); ++it)
        dfs(*it, level+1), E[++E[0]]=nod;
}

int LCA(int nod1, int nod2)
{
    if (nod1>nod2) swap(nod1, nod2);
    int st=F[nod1], dr=F[nod2], Log=lg[dr-st+1];
    int x=RMQ[Log][st], y=RMQ[Log][dr-(1<<Log)+1];
    if (L[x]<L[y]) return x;
        else return y;
}

int main()
{
    f>>N>>M;
    for (int i=2; i<=N; ++i)
        f>>x, G[x].push_back(i);

    dfs(1, 1); RMQ[0][1]=E[1];
    for (int i=2; i<=E[0]; ++i)
        RMQ[0][i]=E[i], lg[i]=lg[i/2]+1;
    for (int i=1; (1<<i)<=E[0]; ++i)
        for (int j=1; j<=E[0]-(1<<i)+1; ++j)
        {
            x=RMQ[i-1][j]; y=RMQ[i-1][j+(1<<(i-1))];
            if (L[x]<L[y]) RMQ[i][j]=x;
                else RMQ[i][j]=y;
        }

    for (int i=1; i<=M; ++i)
        f>>x>>y, g<<LCA(x, y)<<'\n';
    return 0;
}