Cod sursa(job #2062126)

Utilizator osiaccrCristian Osiac osiaccr Data 9 noiembrie 2017 23:54:45
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#define f first
#define s second
#define DEF 100010

using namespace std;

ifstream fin ("lca.in");
ofstream fout ("lca.out");

vector < int > D[DEF];

int n, m, k, log[2 * DEF], fa[DEF];

pair < int, int > sol[20][2 * DEF];

void dfs (int nod, int niv) {
    sol[0][++ k].f = niv;
    sol[0][k].s = nod;
    if (!fa[nod])
        fa[nod] = k;
    for (int i = 0; i < D[nod].size (); ++ i) {
        dfs (D[nod][i], niv + 1);
        sol[0][++ k].f = niv;
        sol[0][k].s = nod;
    }
}

pair < int, int > min_p (pair < int, int > a, pair < int, int > b) {
    if (a.f < b.f)
        return a;
    return b;
}

int main () {
    fin >> n >> m;
    for (int i = 2; i <= n; ++ i) {
        int x;
        fin >> x;
        D[x].push_back (i);
    }

    dfs (1, 0);

    for (int i = 2; i <= k; ++ i) {
        log[i] = log[i / 2] + 1;
    }

    for (int i = 1; (1 << i) <= k; ++ i) {
        for (int j = 1; j <= k - (1 << i) + 1; ++ j) {
            sol[i][j] = min_p (sol[i - 1][j], sol[i - 1][j + (1 << (i - 1))]);
        }
    }

    for (int i = 1; i <= m; ++ i) {
        int x, y, l;
        fin >> x >> y;
        if (fa[x] > fa[y])
            swap (x, y);
        l = log[fa[y] - fa[x] + 1];
        fout << min_p (sol[l][fa[x]], sol[l][fa[y] - (1 << l) + 1]).s << "\n";
    }


    return 0;
}