Cod sursa(job #630209)

Utilizator sunt_emoSunt emo sunt_emo Data 4 noiembrie 2011 22:04:52
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>
#define log2(n) 31-__builtin_clz(n)
#define N 100010

using namespace std;

vector<int> arb[N];
int n,m,i,j,fa[2*N],e[2*N],a[2*N],b[19][2*N],ul,o,lg,M;

void pe (int k,int n) {
    a[i]=k;
    e[i++]=n;
    if (!fa[k]) fa[k]=i;
    for (vector<int>::iterator it=arb[k].begin (); it<arb[k].end (); it++) {
        pe (*it,n+1);
        a[i]=k;
        e[i++]=n;
    }
}

int main () {
    ifstream in ("lca.in");
    ofstream out ("lca.out");
    in>>n>>m;
    M=(n<<1)-1;
    for (i=1; i<n; i++) {
        in>>j;
        arb[j].push_back (i+1);
    }
    i=0;
    pe (1,0);
    for (i=0; i<M; i++) b[0][i]=i;
    lg=log2(M);
    for (i=1,o=1; i<=lg; i++,o<<=1) {
        ul=M-o;
        for (j=0; j<=ul; j++)
            if  (e[b[i-1][j]]<e[b[i-1][j+o]]) b[i][j]=b[i-1][j];
            else b[i][j]=b[i-1][j+o];
    }
    while (m--) {
        in>>i>>j;
        i=fa[i]-1;
        j=fa[j]-1;
        if (j-i<0) { n=i; i=j; j=n; }
        n=log2(j-i+1);
        if (e[b[n][i]]<e[b[n][j-(1<<n)+1]]) lg=b[n][i];
        else lg=b[n][j-(1<<n)+1];
        out<<a[lg]<<"\n";
    }
    return 0;
}