Cod sursa(job #2701842)

Utilizator beingsebiPopa Sebastian beingsebi Data 1 februarie 2021 22:10:06
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
// #define f cin
// #define g cout
int n, ka, depth[100009], rmq[19][200009], first[100009];
vector<vector<int>> v;
int query(int, int);
struct aaa
{
    int dep, nr;
} a[200009];
void dfs(int);
void build_rmq();
int main()
{
    ios_base::sync_with_stdio(false);
    f.tie(nullptr);
    g.tie(nullptr);
    int q;
    f >> n >> q;
    v.resize(n + 1);
    for (int i = 2, x; i <= n; i++)
        f >> x, v[x].emplace_back(i), v[i].emplace_back(x);
    depth[1] = 1;
    dfs(1);
    build_rmq();
    for (int x, y; q; q--)
        f >> x >> y, g << query(x, y) << '\n';
    return 0;
}
void dfs(int x)
{
    a[++ka].nr = x;
    a[ka].dep = depth[x];
    if (!first[x])
        first[x] = ka;
    for (const auto &i : v[x])
        if (!depth[i])
            depth[i] = depth[x] + 1, dfs(i), a[++ka].nr = x, a[ka].dep = depth[x];
}
void build_rmq()
{
    for (int i = 1; i <= ka; i++)
        rmq[0][i] = i;
    for (int i = 1, pd = 1; (1 << i) <= ka; i++, pd <<= 1)
        for (int j = 1; j + (1 << i) - 1 <= ka; j++)
            if (a[rmq[i - 1][j]].dep < a[rmq[i - 1][j + pd]].dep)
                rmq[i][j] = rmq[i - 1][j];
            else
                rmq[i][j] = rmq[i - 1][j + pd];
}
int query(int x, int y)
{
    x = first[x];
    y = first[y];
    int t = log2(y - x + 1);
    int rez;
    if (a[rmq[t][x]].dep < a[rmq[t][y - (1 << t) + 1]].dep)
        return a[rmq[t][x]].nr;
    return a[rmq[t][y - (1 << t) + 1]].nr;
}