Cod sursa(job #1218323)

Utilizator MaarcellKurt Godel Maarcell Data 10 august 2014 15:02:21
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>
#include <iostream>
#define MAXN 100050
using namespace std;

int N,M,K, first[MAXN*4], lvl[MAXN*4], NOD[MAXN*4], rmq[MAXN*4][20]; vector<int> graf[MAXN];

void dfs(int nod, int level){
    NOD[++K]=nod;
    lvl[K]=level;
    first[nod]=K;

    for (unsigned int i=0; i<graf[nod].size(); i++){
        dfs(graf[nod][i],level+1);
        NOD[++K]=nod;
        lvl[K]=level;
    }
}

void build_rmq(void){
    int i,j,l;
    for (i=1; i<=K; i++)
        rmq[i][0]=i;

    for (j=1; (1<<j)<=K; j++)
        for (i=1; i+(1<<j)-1<=K; i++){
            l=1<<(j-1);
            if (lvl[rmq[i][j-1]]<lvl[rmq[i+l][j-1]])
                rmq[i][j]=rmq[i][j-1];
            else
                rmq[i][j]=rmq[i+l][j-1];
        }
}

int lca(int a, int b){
    int ql=first[a], qr=first[b], anc;
    if (qr<ql) swap(ql,qr);

    int log=0, dif=qr-ql+1;
    while ((1<<log)<=dif) log++;
    log--;

    if (lvl[rmq[ql][log]]<lvl[rmq[qr-(1<<log)+1][log]])
        anc=NOD[rmq[ql][log]];
    else
        anc=NOD[rmq[qr-(1<<log)+1][log]];

    return anc;
}
int main(){
    ifstream in("lca.in");
    ofstream out("lca.out");
    in >> N >> M;

    int i,x,y;
    for (i=2; i<=N; i++){
        in >> x;
        graf[x].push_back(i);
    }

    dfs(1,0);
    build_rmq();

    for (i=1; i<=M; i++){
        in >> x >> y;
        out << lca(x,y) << "\n";
    }

    return 0;
}