Cod sursa(job #3357982)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 22:34:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

const int MAXN = 100001;
const int MAXLOG = 17;

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

int n, m;
vector<int> adj[MAXN];
int euler[2 * MAXN], level[2 * MAXN], first[MAXN];
int segtree[8 * MAXN];
int sz = 0;

void dfs(int u, int p, int l) {
    first[u] = sz;
    euler[sz] = u;
    level[sz] = l;
    sz++;
    for (int v : adj[u]) {
        if (v != p) {
            dfs(v, u, l + 1);
            euler[sz] = u;
            level[sz] = l;
            sz++;
        }
    }
}

void build(int node, int start, int end) {
    if (start == end) {
        segtree[node] = start;
    } else {
        int mid = (start + end) / 2;
        build(2 * node, start, mid);
        build(2 * node + 1, mid + 1, end);
        if (level[segtree[2 * node]] < level[segtree[2 * node + 1]])
            segtree[node] = segtree[2 * node];
        else
            segtree[node] = segtree[2 * node + 1];
    }
}

int query(int node, int start, int end, int l, int r) {
    if (r < start || end < l) return -1;
    if (l <= start && end <= r) return segtree[node];
    int mid = (start + end) / 2;
    int left = query(2 * node, start, mid, l, r);
    int right = query(2 * node + 1, mid + 1, end, l, r);
    if (left == -1) return right;
    if (right == -1) return left;
    return level[left] < level[right] ? left : right;
}

int main() {
    fin >> n >> m;
    for (int i = 2; i <= n; i++) {
        int p;
        fin >> p;
        adj[p].push_back(i);
        adj[i].push_back(p);
    }
    dfs(1, 0, 0);
    build(1, 0, sz - 1);
    for (int i = 0; i < m; i++) {
        int u, v;
        fin >> u >> v;
        int l = first[u], r = first[v];
        if (l > r) swap(l, r);
        int idx = query(1, 0, sz - 1, l, r);
        fout << euler[idx] << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}