Cod sursa(job #3297838)

Utilizator Alex_at_gameIustin-Alexandru Frateanu Alex_at_game Data 23 mai 2025 21:27:07
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#include <bits/stdc++.h>
using namespace std;

const string nume = "lca.";
ifstream fin(nume + "in");
ofstream fout(nume + "out");

#define cin fin
#define cout fout
#define pb push_back
#define pii pair<int, int>
#define fr first
#define sd second

const int M = (int)1e5;

int n, q, a, f[M + 5], x, y;
bool viz[M + 5];
vector<int> v[M + 5];
vector<pii> euler, rmq[20];

void dfs(int x, int h) {
    viz[x] = true;
    euler.pb({x, h});
    f[x] = euler.size();

    for (int i : v[x]) {
        if (!viz[i]) {
            dfs(i, h + 1);
            euler.pb({x, h});
        }
    }
}

pii MIN(pii a, pii b) {
    return a.sd > b.sd ? b : a;
}

signed main() {
    cin >> n >> q;

    for (int i = 1; i < n; ++i) {
        cin >> a;

        v[a].pb(i + 1);
        v[i + 1].pb(a);
    }

    dfs(1, 1);

    int tot = euler.size();
    for (int i = 0; i < tot; ++i) {
        rmq[0].pb({euler[i].fr, euler[i].sd});
    }

    int sz = log2(tot);
    for (int i = 1; i <= sz; ++i) {
        tot -= (1 << (i - 1));
        for (int j = 1; j <= tot; ++j) {
            rmq[i].pb(MIN(rmq[i - 1][j - 1], rmq[i - 1][j - 1 + (1 << (i - 1))]));
        }
    }

    for (int i = 1; i <= q; ++i) {
        cin >> x >> y;

        int mx = max(f[x], f[y]), mn = min(f[x], f[y]);
        int d = mx - mn + 1, p = 1, e = 0;

        while (p <= d) {
            p <<= 1;
            e++;
        }

        p >>= 1;
        e--;

        cout << MIN(rmq[e][mn - 1], rmq[e][mx - p]).fr << "\n";
    }
}