Cod sursa(job #1562965)

Utilizator livliviLivia Magureanu livlivi Data 5 ianuarie 2016 16:44:06
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<cstdio>
#define N 100000
#define P 17
using namespace std;

int stra[P][N+1];
int nivel[N+1];

void afla(int i){
    if (nivel[i]==0){
        afla(stra[0][i]);
        nivel[i]=nivel[stra[0][i]]+1;
    }
}

int adu(int x,int niv){
    int p;

    for(p=16;p>=0;p--)
        if (nivel[stra[p][x]]>=niv) x=stra[p][x];

    return x;
}

int lca(int x,int y){
    if (nivel[x]>nivel[y]) x=adu(x,nivel[y]);
    else y=adu(y,nivel[x]);

    int p;
    for(p=16;p>=0;p--)
        if (stra[p][x]!=stra[p][y]){
            x=stra[p][x];
            y=stra[p][y];
        }

    if (x!=y) x=stra[0][x];

    return x;
}

int main(){
    freopen ("lca.in","r",stdin);
    freopen ("lca.out","w",stdout);
    int n,m,i,j,x,y;

    scanf ("%d%d",&n,&m);

    for(i=2;i<=n;i++)
        scanf ("%d",&stra[0][i]);

    for(i=1;i<P;i++)
        for(j=2;j<=n;j++)
            stra[i][j]=stra[i-1][stra[i-1][j]];

    nivel[1]=1;
    for(i=2;i<=n;i++)
        if (nivel[i]==0) afla(i);

    for(i=1;i<=m;i++){
        scanf ("%d%d",&x,&y);
        printf ("%d\n",lca(x,y));
    }

    return 0;
}