Cod sursa(job #2372320)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 7 martie 2019 01:13:38
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

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

const int VAL=200005;
const int CNT=25;

int N, Q, i, j, nod, PUT[VAL], A, B, cnt;
int E[VAL], K, RMQ[VAL][CNT], be, en;
int F[VAL], L[VAL], niv[VAL], X, Y, P;
vector <int> G[VAL];

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

int main()
{
    fin >> N >> Q;
    for (i=2; i<=N; i++)
    {
        fin >> nod;
        G[nod].push_back(i);
    }
    niv[1]=1;
    DFS(1);
    for (i=1; i<=K; i++)
    {
        PUT[i]=PUT[i-1];
        if (i==(1 << (PUT[i]+1)))
            PUT[i]++;
    }
    for (cnt=0; cnt<=PUT[K]; cnt++)
    {
        for (i=1; i<=K; i++)
        {
            if (cnt==0)
            {
                RMQ[i][cnt]=E[i];
                continue;
            }
            j=i+(1 << cnt)-1;
            A=RMQ[i][cnt-1];
            B=RMQ[(i+j+2) / 2][cnt-1];
            if (niv[A]<niv[B])
                RMQ[i][cnt]=A;
            else
                RMQ[i][cnt]=B;
        }
    }
    while (Q>0)
    {
        Q--;
        fin >> X >> Y;
        i=min(F[X], F[Y]);
        j=max(L[X], L[Y]);
        cnt=PUT[j-i+1];
        P=1 << cnt;
        A=RMQ[i][cnt];
        B=RMQ[j-P+1][cnt];
        if (niv[A]<niv[B])
            fout << A << '\n';
        else
            fout << B << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}