Cod sursa(job #1337811)

Utilizator retrogradLucian Bicsi retrograd Data 9 februarie 2015 15:28:31
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream>
#include<vector>

using namespace std;
typedef int var;

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

const var LEN = 100;
const var MAXN = 100001;

var PARENT2[MAXN], PARENT[MAXN], RANK[MAXN];
vector<var> FII[MAXN];

void makepar(var node, var p) {
    PARENT2[node] = p;
    RANK[node] = RANK[PARENT[node]] + 1;
    for(vector<var>::iterator it = FII[node].begin(); it != FII[node].end(); ++it) {
        if(RANK[node]%LEN == 0) {
            makepar(*it, node);
        } else {
            makepar(*it, p);
        }
    }
}



var lca(var a, var b) {

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

    return a;
}



int main() {
    var n, m, a, b;
    fin>>n>>m;
    for(var i=2; i<=n; i++) {
        fin>>PARENT[i];
        FII[PARENT[i]].push_back(i);
    }

    makepar(1, 0);

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

    return 0;
}