Cod sursa(job #1500692)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 12 octombrie 2015 16:26:16
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <cmath>
#include <vector>

using namespace std;

const int Nmax = (int) 1e5;
const int NIL = -1;

vector <int> adj[Nmax];

int father[Nmax], d[Nmax], gr[Nmax];
int sqrtN;

void DFS(int u, int group) {
    gr[u] = group;

    if (d[u] % sqrtN == 0) {
        group = u;
    }

    for (auto v : adj[u]) {
        d[v] = d[u] + 1;
        DFS(v, group);
    }
}

int inline lca(int u, int v) {
    while (gr[u] != gr[v]) {
        if (d[u] > d[v]) {
            u = gr[u];
        } else {
            v = gr[v];
        }
    }
    while (u != v) {
        if (d[u] > d[v]) {
            u = father[u];
        } else {
            v = father[v];
        }
    }
    return u;
}

int main(void) {
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    int n, m;
    int u, v;

    scanf("%d%d", &n, &m);

    for (int i = 1; i < n; i++) {
        scanf("%d", &u);
        adj[u - 1].emplace_back(i);
        father[i] = u - 1;
    }

    sqrtN = (int) sqrt(n - 1) + 1;
    DFS(0, 0);

    for (int i = 0; i < m; i++) {
        scanf("%d%d", &u, &v);
        printf("%d\n", lca(u - 1, v - 1) + 1);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}