Cod sursa(job #1548654)

Utilizator tiby10Tibi P tiby10 Data 11 decembrie 2015 11:27:24
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100002
int n, m, p[21][MAXN], D[MAXN];

void pre(){
    int i, j;
    for(i=1; i<=20; ++i)
        for(j=1; j<=n; ++j)
            p[i][j]=p[i-1][p[i-1][j]];
}

int query(int a, int b){
    if(D[a]<D[b]) swap(a, b);
    int delta=D[a]-D[b];
    for(int i=0; (1<<i)<=delta; ++i)
        if((delta>>i)&1)
            a=p[i][a];
    if(a==b) return a;
    for(int i=20; i>=0; --i)
        if(p[i][a]!=p[i][b])
            a=p[i][a], b=p[i][b];
    return p[0][a];
}

int main ()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d%d",&n,&m);
    int i, a, b;
    for(i=2; i<=n; ++i){
        scanf("%d",&a);
        D[i]=D[a]+1;
        p[0][i]=a;
    }
    while(m--){
        scanf("%d%d",&a,&b);
        printf("%d\n",query(a, b));
    }
    return 0;
}