Cod sursa(job #2208414)

Utilizator oso.andinoooIonut Stan oso.andinooo Data 29 mai 2018 18:25:23
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 5, LG = 20;

int v[N], dp[LG][N];
int f[N];
vector <int> g[N];

void dfs(int n) {
    for (auto i : g[n]) {
        if (v[i] == 0) {
            f[i] = f[n] + 1;
            v[i] = n;
            dfs(i); } } }

int main() {
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    int n, m, x, q, r;

    scanf("%d %d", &n, &m);
    for (int i = 2; i <= n; i++) {
        scanf("%d", &x);
        g[x].push_back(i);
        g[i].push_back(x); }

    f[1] = 1;
    v[1] = -1;
    dfs(1);
    v[1] = 0;

    for (int i = 1; i <= n; i++) {
        dp[0][i] = v[i]; }

    for (int i = 1; i < LG; i++) {
        for (int j = 1; j <= n; j++) {
            dp[i][j] = dp[i - 1][dp[i - 1][j]]; } }

    for (int i = 1; i <= m; i++) {
        int y;
        scanf("%d %d", &x, &y);
        if (f[x] < f[y]) {
            r = f[y] - f[x];
            int p = 0;
            while (r) {
                if (r % 2 == 1) {
                    y = dp[p][y];}
                p++;
                r = r / 2; } }
        if (f[x] > f[y]) {
            r = f[x] - f[y];
            int p = 0;
            while (r) {
                if (r % 2 == 1) {
                    x = dp[p][x]; }
                p++;
                r = r / 2; } }
        for (int p = LG - 1; p >= 0; p--) {
            if (dp[p][x] != dp[p][y]) {
                x = dp[p][x];
                y = dp[p][y]; } }
        if (x == y)
            printf("%d\n", x);
        else
            printf("%d\n", v[x]); }
    return 0; }