Cod sursa(job #3358025)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 23:06:16
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const int NMAX = 100005;
const int LOGMAX = 18;

int n, m;
vector<int> g[NMAX];
int euler[2 * NMAX], euler_len;
int first_pos[NMAX];
int depth[NMAX];

void dfs(int u, int d) {
    first_pos[u] = euler_len;
    euler[euler_len++] = u;
    depth[u] = d;
    for (int v : g[u]) {
        dfs(v, d + 1);
        euler[euler_len++] = u;
    }
}

int lg[2 * NMAX];
int rmq[LOGMAX][2 * NMAX];

int main() {
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);

    scanf("%d %d", &n, &m);
    for (int i = 2; i <= n; i++) {
        int tata;
        scanf("%d", &tata);
        g[tata].push_back(i);
    }

    dfs(1, 0);

    int sz = euler_len;
    for (int i = 0; i < sz; i++) {
        rmq[0][i] = euler[i];
    }

    for (int i = 2; i <= sz; i++) {
        lg[i] = lg[i / 2] + 1;
    }

    for (int j = 1; (1 << j) <= sz; j++) {
        for (int i = 0; i + (1 << j) <= sz; i++) {
            int u = rmq[j - 1][i];
            int v = rmq[j - 1][i + (1 << (j - 1))];
            rmq[j][i] = depth[u] < depth[v] ? u : v;
        }
    }

    while (m--) {
        int x, y;
        scanf("%d %d", &x, &y);
        int l = first_pos[x], r = first_pos[y];
        if (l > r) swap(l, r);
        int k = lg[r - l + 1];
        int u = rmq[k][l];
        int v = rmq[k][r - (1 << k) + 1];
        int ans = depth[u] < depth[v] ? u : v;
        printf("%d\n", ans);
    }

    return 0;
}