Cod sursa(job #2353186)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 23 februarie 2019 22:54:56
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <vector>
#define Nmax 100005

using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");

int n, Q, x, y;
vector <int> v[Nmax];
int first[Nmax], eul[2*Nmax], ne;
int rmq[18][2*Nmax], niv[Nmax], log2[2*Nmax];

void dfs(int x)
{
    eul[++ne]=x;
    first[x]=ne;
    for (auto y:v[x])
    {
        niv[y]=niv[x]+1;
        dfs(y);
        eul[++ne]=x;
    }
}

void RMQ()
{
    for (int i = 1; i <= ne; i++)
        rmq[0][i]=eul[i];
    for (int i = 2; i <= ne; i++)
        log2[i]=log2[i/2]+1;

    for (int i = 1; (1<<i) <= ne; i++)
        for (int j = 0; j+(1<<i)-1 <= ne; j++)
        {
            int x=rmq[i-1][j];
            int y=rmq[i-1][j+(1<<(i-1))];
            rmq[i][j]=min(x, y);
        }
}

int query(int x, int y)
{
    int aa = first[x];
    int bb = first[y];

    if(aa > bb)
        swap(aa, bb);

    int i = log2[bb - aa + 1];
    return min(rmq[i][aa-1], rmq[i][bb - (1<<i) ]);

}
int main()
{
    f >> n >> Q;
    for (int i = 2, x; i <= n; i++)
    {
        f >> x;
        v[x].push_back(i);
    }

    dfs(1);
    RMQ();

    while(Q--)
    {
        f >> x >> y;
        g << query(x, y) << '\n';

    }
    return 0;
}