Cod sursa(job #2208436)

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

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

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

int main() {
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    int n, m, x, y, p, q, r;
    f[1] = 1;
    v[1] = 0;
    scanf("%d %d", &n, &m);
    for (int i = 2; i <= n; i++) {
        scanf("%d", &vec[i]);
        v[i] = vec[i];
        g[vec[i]].push_back(i);
        g[i].push_back(vec[i]); }

    for (int i = 2; i <= n; i++) {
        int a = 1, cp = i;
        while (f[v[cp]] == 0) {
            a++;
            cp = v[cp]; }
        f[i] = f[v[cp]] + a;
        for (int j = i + 1; j <= cp; j++) {
            v[j] = v[j - 1] - 1; } }

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

    for (int lg = 1; lg < LG; lg++)
        for (int nod = 1; nod <= n; nod++)
            dp[lg][nod] = dp[lg - 1][dp[lg - 1][nod]];

    for (int i = 1; i <= m; i++) {
        scanf("%d %d", &x, &y);
        if (f[x] > f[y])
            swap(x, y);

        r = f[y] - f[x];
        p = 0;
        while (r) {
            if (r % 2 == 1)
                y = dp[p][y];
            p+= 1;
            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; }