Cod sursa(job #1318261)

Utilizator retrogradLucian Bicsi retrograd Data 15 ianuarie 2015 19:50:46
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream>


using namespace std;

typedef int var;

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

var *PARENT, *RANK, *PARENTX;
var n;
bool C[100001];

inline var lca(var &a, var &b) {
    while(RANK[PARENTX[a]] >= RANK[b]) a = PARENTX[a];
    while(RANK[PARENTX[b]] >= RANK[a]) b = PARENTX[b];
    while(RANK[a] > RANK[b]) a = PARENT[a];
    while(RANK[b] > RANK[a]) b = PARENT[b];
    while(PARENTX[a] != PARENTX[b]) {a = PARENTX[a]; b = PARENTX[b];}
    while(a!=b) {a = PARENT[a]; b = PARENT[b];}
    return a;
}

var t;
inline void makeParentX(const var &nod, const var &X) {
    t = nod;
    for(var i=1; i<=X && t; i++) {
        t = PARENT[t];
    }
    PARENTX[nod] = t;
}

int main() {

    var i, q;
    var a, b;

    fin>>n>>q;
    PARENT = new var[n+1];
    RANK = new var[n+1];
    PARENTX = new var[n+1];
    PARENT[1] = PARENTX[1] = RANK[1] = 0;
    PARENT[0] = PARENTX[0] = 0;
    RANK[0] = -1;

    for(i=2; i<=n; i++) {
        fin>>PARENT[i];
        RANK[i] = RANK[PARENT[i]] + 1;
        makeParentX(i, 80);
    }

    while(q--) {
        fin>>a>>b;
        fout<<lca(a, b)<<'\n';
    }

    return 0;
}