Cod sursa(job #716910)

Utilizator deneoAdrian Craciun deneo Data 19 martie 2012 13:24:52
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>
using namespace std;

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

int n, m, t[500100], rmq[20][100100], first[100100];
vector<int> g[100100];

void doDFS(int nod) {
    int i;
    t[++t[0]] = nod;
    first[nod] = t[0];
    for (i = 0; i < g[nod].size(); ++i) {
        doDFS(g[nod][i]);
        t[++t[0]] = nod;
    }
}

void doRMQ() {
    int i, j;
    for (i = 1; i <= t[0]; ++i)
        rmq[0][i] = t[i];
    for (i = 1; (1 << i) <= t[0]; ++i)
        for (j = 1; j + (1 << i) - 1 <= t[0]; ++j)
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
}

int query(int a, int b) {
    int x, y, i;
    x = first[a]; y = first[b];
    if (x > y) swap(x, y);
    for (i = 1; (1 << i) <= (y - x + 1); ++i);
    --i;
    return min(rmq[i][x], rmq[i][y - (1 << i) + 1]);
}

int main() {
    int i, a, b;
    fin >> n >> m;
    for (i = 2; i <= n; ++i) {
        fin >> a;
        g[a].push_back(i);
    }
    doDFS(1);
    doRMQ();
    for (i = 1; i <= m; ++i) {
        fin >> a >> b;
        fout << query(a, b) << "\n";
    }
    fout.close();
    return 0;
}