Cod sursa(job #3263276)

Utilizator devilexeHosu George-Bogdan devilexe Data 14 decembrie 2024 09:55:36
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
using namespace std;

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

const int MAXN = 1e5, log_MAXN = 17;
pair<int, int> rmq[2 * MAXN + 1][log_MAXN + 1];
int N, M, sz = 0;
vector<int> G[MAXN + 1];
bitset<MAXN + 1> viz;
int idx[MAXN + 1];

void dfs(int nod, int depth) {
    viz[nod] = 1;
    idx[nod] = sz;
    rmq[sz++][0] = make_pair(depth, nod);
    for (const auto& x : G[nod]) {
        if (!viz[x]) {
            dfs(x, depth + 1);
            rmq[sz++][0] = make_pair(depth, nod);
        }
    }
}

int main() {
    fin >> N >> M;
    int dad;
    for (int i = 2; i <= N; ++i) {
        fin >> dad;
        G[dad].push_back(i);
    }
    dfs(1, 0);
    for (int p = 1; (1 << p) <= sz; ++p) {
        for (int i = 0; i + (1 << (p - 1)) < sz; ++i) {
            rmq[i][p] = min(rmq[i][p - 1], rmq[i + (1 << (p - 1))][p - 1]);
        }
    }
    int a, b;
    while (M--) {
        fin >> a >> b;
        int i = idx[a], j = idx[b];
        if (i > j)
            swap(i, j);
        int len = j - i + 1;
        int p = 31 - __builtin_clz(len);
        fout << min(rmq[i][p], rmq[j - (1 << p) + 1][p]).second << '\n';
    }
    return 0;
}