Cod sursa(job #2640596)

Utilizator AMAZONAMAZON GAZON AMAZON Data 7 august 2020 00:16:54
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <fstream>
#include <vector>
#define INF 100100
#define N 18
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n;
int low[INF];
int m;
pair <int, int>query;
vector <int>NOD[INF];
int euleR[INF * 4];
int point;
int position[INF];
int rmq[N][INF * 4];
int ans[INF * 4];
inline void read()
{
    f >> n;
    f >> m;
    for (int i = 1; i <= n - 1; ++i)
    {
        f >> low[i];
    }
}
void  DFS(int x)
{
    point++;
    euleR[point] = x;
    for (int i = 0; i < NOD[x].size(); ++i)
    {
        DFS(NOD[x][i]);
        point++;
        euleR[point] = x;
    }
}
inline void euler()
{
    for (int i = 1; i <= n; ++i)
    {
        NOD[low[i]].push_back(i + 1);
    }
    DFS(1);
    for (int i = 1; i <= point; ++i)
    {
        if (position[euleR[i]] == 0)
        {
            position[euleR[i]] = i;
        }
    }
}
int minim(int x, int y)
{
    if (x < y)
        return x;
    else return y;
}
inline void RMQ()
{
    for (int i = 1; i <= point; ++i)
    {
        rmq[0][i] = euleR[i];
    }
    for (int i = 1; (1 << i) <= point; ++i)
    {
        for (int j = 1; (j + (1 << i)) <= point; ++j)
        {
            rmq[i][j] = minim(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
        }
    }
    ans[1] = 0;
    for (int i = 2; i <= point; ++i)
    {
        ans[i] = ans[i / 2] + 1;
    }
}
inline void RMQ_answer(int x, int y)
{
    int length = y - x + 1;
    g << minim(rmq[ans[length]][1], rmq[ans[length]][1]) << "\n";
}
inline void writtlen()
{
    for (int i = 1; i <= m; ++i)
    {
        f >> query.first >> query.second;
        RMQ_answer(position[query.first], position[query.second]);
    }
}
int main()
{
    read();
    euler();
    RMQ();
    writtlen();
    return 0;
}