Cod sursa(job #630181)

Utilizator sunt_emoSunt emo sunt_emo Data 4 noiembrie 2011 20:38:56
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <cstdlib>
#define log2(n) 31-__builtin_clz(n)

using namespace std;

typedef struct node {
    int data;
    struct node * next;
} node;

node * arb [100010],*k;
int n,m,i,j,fa[100010],e[200010],a[200010],b[21][200010],ul,o,lg;

void pe (int k,int n) {
    e[i++]=n;
    if (!fa[k]) fa[k]=i;
    a[i-1]=k;
    node *t=arb[k];
    while (t) {
        pe (t->data,n+1);
        e[i++]=n;
        a[i-1]=k;
        t=t->next;
    }
}

int main () {
    ifstream in ("lca.in");
    ofstream out ("lca.out");
    in>>n>>m;
    for (i=0; i<n-1; i++) {
        in>>j;
        k=(node*) malloc (sizeof (node));
        k->data=i+2;
        k->next=arb[j];
        arb[j]=k;
    }
    i=0;
    pe (1,0);
    for (i=0; i<2*n-1; i++) b[0][i]=i;
    lg=log2(2*n-1);
    for (i=1,o=1; i<=lg; i++,o<<=1) {
        ul=2*n-1-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];
    }
    for (;m;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;
}