Cod sursa(job #1140856)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 12 martie 2014 12:23:28
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<cstdio>
#include<vector>
using namespace std;
const int N=100000;
vector<int>sons[N];
int r[18][N+1];
int e[2*N+1],nivel[N+1],first[N+1],eNivel[2*N+1],log[2*N+1];
int n,m,eL;
void citire(){
    int i,scan;
    scanf("%d%d",&n,&m);
    for(i=1;i<n;i++){
        scanf("%d",&scan);
        sons[scan].push_back(i+1);
    }
}
void init(){
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    citire();
}
void dFS(int x){
    int i;
    e[++eL]=x;
    eNivel[eL]=nivel[x];
    first[x]=eL;
    for(i=0;i<sons[x].size();i++){
        nivel[sons[x][i]]=nivel[x]+1;
        dFS(sons[x][i]);
        e[++eL]=x;
        eNivel[eL]=nivel[x];
    }
}
int min2(int x, int y){
    if (x<y)
        x=y;
    return x;
}
void setR(){
    int i,j,l;
    for(i=2;i<=eL;i++)
        log[i]=log[i/2]+1;
    for(i=1;i<=eL;i++)
        r[0][i]=eNivel[i];
    for (i=1;(1<<i)<=n;i++)
        for(j=1;j<=n-(1<<i)+1;j++){
            l=1<<(i-1);
            r[i][j]=min2(r[i-1][j],r[i-1][j+l]);
        }
}
int rMQ(int x,int y){
    int l,diff,sh;
    x=first[x];
    y=first[y];
    diff=y-x+1;
    l=log[diff];
    sh=diff-(1<<l);
    return min2(r[l][x],r[l][x+sh]);
}
int main(){
    int i,x,y;
    init();
    dFS(1);
    setR();
    for(i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        printf("%d\n",rMQ(x,y));
    }
    return 0;
}