Cod sursa(job #2947595)

Utilizator ZenoTeodor Anitoaei Zeno Data 26 noiembrie 2022 13:53:40
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
//#include <bits/stdc++.h>

#include <fstream>
#include <vector>

#define NMAX 100000
#define LOG 17

using namespace std;

typedef long long ull;

vector<int> tree[NMAX];
int depth[NMAX];
int up[NMAX][LOG];

ifstream cin("lca.in");
ofstream cout("lca.out");

void dfs(int parent) {
    for (int i = 0; i < tree[parent].size(); i++) {
        int child = tree[parent][i];
        depth[child] = depth[parent] + 1;
        up[child][0] = parent;
        for (int k = 1; k < LOG; k++) {
            up[child][k] = up[up[parent][k - 1]][k - 1];
        }
        dfs(child);
    }
}

int lca(int a, int b) {
    // Get A and B to the same depth
    if (depth[a] < depth[b]) {
        swap(a, b);
    }
    while (depth[a] > depth[b]) {
        a = up[a][0];
    }
    if (a == b) {
        return a;
    }
    for (int k = LOG - 1; k >= 0; k--) {
        if (up[a][k] != up[b][k]) {
            a = up[a][k];
            b = up[b][k];
        }
    }

    return up[a][0];
}

int main() {
    int n, m;
    cin >> n >> m;

    for (int i = 1; i < n; i++) {
        int r;
        cin >> r;
        r--;
        tree[r].push_back(i);
    }
    dfs(0);
    while (m--) {
        int a, b;
        cin >> a >> b;
        cout << lca(a-1, b-1) + 1 << '\n';
    }

    return 0;
}