Cod sursa(job #2229867)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 8 august 2018 12:00:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
#define VAL 200005
#define PUT 25

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

int N, M, i, j, nod, E[VAL], L[VAL];
int RMQ[VAL][PUT], K, A, B, P, be, en;
int First[VAL], Last[VAL], LOG[VAL], X, Y;
vector <int> G[VAL];

void DFS(int nod, int niv)
{
    vector <int> :: iterator it;
    E[++K]=nod;
    L[K]=niv;
    RMQ[K][0]=K;
    if (First[nod]==0)
        First[nod]=K;
    Last[nod]=K;
    for (it=G[nod].begin(); it!=G[nod].end(); it++)
    {
        DFS(*it, niv+1);
        E[++K]=nod;
        L[K]=niv;
        RMQ[K][0]=K;
        Last[nod]=K;
    }
}

int main()
{
    fin >> N >> M;
    for (i=2; i<=N; i++)
    {
        fin >> X;
        G[X].push_back(i);
    }
    DFS(1, 1);
    E[0]=L[0]=VAL;
    for (i=1; i<=K; i++)
    {
        LOG[i]=P;
        if (i==2*(1 << P))
            P++;
    }
    for (j=1; j<=P; j++)
    {
        for (i=1; i+(1 << j)-1<=K; i++)
        {
            A=RMQ[i][j-1];
            B=RMQ[i+(1 << (j-1))][j-1];
            if (L[A]<L[B])
                RMQ[i][j]=A;
            else
                RMQ[i][j]=B;
        }
    }
    for (i=1; i<=M; i++)
    {
        fin >> X >> Y;
        if (First[X]>Last[Y])
            swap(X, Y);
        be=First[X];
        en=Last[Y];
        A=LOG[en-be+1];
        B=(1 << A);
        X=RMQ[be][A];
        Y=RMQ[en-B+1][A];
        if (L[X]<L[Y])
            fout << E[X] << '\n';
        else
            fout << E[Y] << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}