Cod sursa(job #2397806)

Utilizator KusikaPasa Corneliu Kusika Data 4 aprilie 2019 19:34:37
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
using namespace std;

int n, q, timer, l;
int tin[1<<20], tout[1<<17], up[1<<17][50];
vector<int> g[1<<17];

void dfs(int u, int p) {
    tin[u] = ++timer;
    up[u][0] = p;
    for (int i = 1; i <= l; i++)
        up[u][i] = up[up[u][i-1]][i-1];
    for (auto v : g[u]) dfs(v,u);
    tout[u] = ++timer;
}

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

int lca(int u, int v) {
    if (ancestor(u,v)) return u;
    if (ancestor(v,u)) return v;
    for (int i = l; i >= 0; i--) {
        if (!ancestor(up[u][i],v)) u = up[u][i];
    }
    return up[u][0];
}

int main() {
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    cin >> n >> q;
    l = ceil(log2(n));
    for (int i = 1; i < n; i++) {
        int v;
        cin >> v;
        v--;
        g[v].push_back(i);
    }
    dfs(0,0);
    while (q--) {
        int u, v;
        cin >> u >> v;
        u--, v--;
        cout << lca(u,v) + 1 << '\n';
    }
}