Cod sursa(job #1341599)

Utilizator retrogradLucian Bicsi retrograd Data 12 februarie 2015 22:18:31
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<fstream>
#include<vector>

using namespace std;
typedef int var;

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

const var MAXN = 100001;

vector<var> G[MAXN];

var D[MAXN], PARENT[MAXN], PARENT2[MAXN], P_D[MAXN];

void dfs(var node) {
    PARENT2[node] = P_D[D[node]/2];
    P_D[D[node]] = node;

    for(vector<var>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
        D[*it] = D[node] + 1;
        dfs(*it);
    }
}

inline var lca(var a, var b) {



    while(D[PARENT2[a]] >= D[b]) {
        a = PARENT2[a];
    }
    while(D[PARENT2[b]] >= D[a]) {
        b = PARENT2[b];
    }
    while(D[a] > D[b]) {
        a = PARENT[a];
    }
    while(D[b] > D[a]) {
        b = PARENT[b];
    }

    while(PARENT2[a] != PARENT2[b]) {
        a = PARENT2[a];
        b = PARENT2[b];
    }

    while(a != b) {
        a = PARENT[a];
        b = PARENT[b];
    }

    return a;
}

void citire() {
    var n, m, a, b;
    fin>>n>>m;
    for(var i=2; i<=n; i++) {
        fin>>PARENT[i];
        G[PARENT[i]].push_back(i);
    }
    dfs(1);
    while(m--) {
        fin>>a>>b;
        if (a == 1 || b == 1) {
            fout<<1<<'\n';
        }
        fout<<lca(a, b)<<'\n';
    }
}

int main() {
    citire();
    return 0;
}