Cod sursa(job #3228634)

Utilizator test1111fsf sfhs f hskfh 11 test1111 Data 9 mai 2024 11:58:27
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NM = 1e5 + 5;

int up[NM][20];
int tin[NM], tout[NM], timp;
int n, m, l;
vector<int>g[NM];

void dfs (int nod, int dad = 1) {
    tin[nod] = ++timp;
    up[nod][0] = dad;
    for (int i = 1; i <= l; i++) {
        up[nod][i] = up[up[nod][i - 1]][i - 1];
    }
    for (int u : g[nod]) {
        if (u == dad) {
            continue;
        }
        dfs(u, nod);
    }
    tout[nod] = ++timp;
}

bool is_ancestor (int u, int v) {
    return (tin[u] <= tin[v] && tout[u] >= tout[v]);
}

int main () {
    fin >> n >> m;
    l = ceil(log2(n));
    for (int i = 2; i <= n; i++) {
        int x; fin >> x;
        g[x].push_back(i);
    }
    dfs(1);
    while (m--) {
        int u, v; fin >> u >> v;
        if (is_ancestor(u, v)) {
            fout << u << '\n';
        } else if (is_ancestor(v, u)) {
            fout << v << '\n';
        } else {
            for (int i = l; i >= 0; i--) {
                if (!is_ancestor(up[u][i], v)) {
                    u = up[u][i];
                }
            }
            fout << up[u][0] << '\n';
        }
    }
}