Cod sursa(job #1548640)

Utilizator tiby10Tibi P tiby10 Data 11 decembrie 2015 10:57:13
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100002
ifstream fin("lca.in");
ofstream fout("lca.out");
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 ()
{
    fin>>n>>m;
    int i, a, b;
    for(i=1; i<n; ++i){
        fin>>a;
        D[i+1]=D[a]+1;
        p[0][i+1]=a;
    }
    while(m--){
        fin>>a>>b;
        fout<<query(a, b)<<'\n';
    }
    return 0;
}