Cod sursa(job #1450875)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 14 iunie 2015 23:47:35
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#define DIM 222222
using namespace std;

int N, M, i, j, A[20][DIM], K, k, X, Y;
int NIV[DIM], EUL[DIM], P[DIM];
vector <int> V[DIM];

void BFS(int nod, int dep){

    K ++;
    EUL[K] = nod;
    NIV[K] = dep;
    P[nod] = K;

    for(int i = 0; i < V[nod].size(); i ++){
        int vec = V[nod][i];

        BFS(vec, dep + 1);

        K ++;
        EUL[K] = nod;
        NIV[K] = dep;
        P[nod] = K;
    }

    return;
}

int main(){

    freopen("lca.in" ,"r", stdin );
    freopen("lca.out","w", stdout);

    scanf("%d %d", &N, &M);

    for(int i = 2; i <= N; i ++){
        scanf("%d", &X);
        V[X].push_back(i);
    }

    BFS(1, 0);

    for(int i = 1; i <= K; i ++)
        A[0][i] = i;

    for(int k = 1; (1<<k) <= K; k ++){
        for(int i = 1; i <= K; i ++){
            int j = i + (1<<(k-1));
            A[k][i] = A[k-1][i];
            if(j <= K)
                if(NIV[A[k-1][j]] < NIV[A[k-1][i]])
                    A[k][i] = A[k-1][j];
        }
    }

/*
    for(int i = 1; i <= K; i ++)
        printf("%d ", NIV[i]);
    printf("\n");

    for(int k = 0; (1<<k) <= K; k ++){
        printf("\n");
        for(int i = 1; i <= K; i ++)
            printf("%d ", A[k][i]);
    }
*/

    for(int i = 1; i <= M; i ++){
        scanf("%d %d", &X, &Y);
        X = P[X]; Y = P[Y];
        if(X > Y) swap(X, Y);
        int dist = Y - X + 1, k;
        for(k = 0; (1<<k) <= dist; k ++); k --;
        if(NIV[A[k][X]] <= NIV[A[k][Y-(1<<k)+1]])
            printf("%d\n", EUL[A[k][X]]);
        else
            printf("%d\n", EUL[A[k][Y-(1<<k)+1]]);
    }

    return 0;
}