Cod sursa(job #1814469)

Utilizator vazanIonescu Victor Razvan vazan Data 24 noiembrie 2016 00:37:23
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
#define NMAX 100100
vector<int> G[NMAX];
int euler_tour[3*NMAX], elen=1, occur[NMAX];
void dfs(int u){
    if(!occur[u])
        occur[u]=elen;
    euler_tour[elen++]=u;
    int v;
    for(int i=0; i<G[u].size(); i++){
        v=G[u][i];
        dfs(v);
        euler_tour[elen++]=u;
    }
}
int din[3*NMAX][100];
int main(){
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    int n, q, t, i, j, r1, r2, k, aux;
    scanf("%d%d", &n, &q);
    for(i=2; i<=n; i++){
        scanf("%d", &t);
        G[t].push_back(i);
    }
    dfs(1);
    elen--;
   /* for(i=1; i<=elen; i++)
        printf("%d ", euler_tour[i]);
    printf("\n");*/
    for(i=1; i<=elen; i++){
        din[i][0]=i;
    }
    for(j=1; (1 << j) <=elen; j++){
        for(i=1; i + (1 << j) <= elen; i++){
            if(euler_tour[din[i][j - 1]] < euler_tour[din[i + (1 << (j - 1))][j - 1]])
                din[i][j] = din[i][j - 1];
            else
                din[i][j] = din[i + (1 << (j - 1))][j-1];
        }
    }
    /*for(i=1; i <= elen; i++){
        for(j=0; i + (1 << j) <= elen; j++)
            printf("%d", euler_tour[din[i][j]]);
        printf("\n");
    }*/
    for(i = 1; i <= q; i++){
        scanf("%d%d", &r1, &r2);
        r1=occur[r1];
        r2=occur[r2];
        if(r2<r1){
            aux=r1;
            r1=r2;
            r2=aux;
        }
        k = log2(r2 - r1 + 1.0);
        printf("%d\n", min(euler_tour[din[r1][k]], euler_tour[din[r2 - (1<<k) +1][k]]));
    }
    return 0;
}