Cod sursa(job #1193383)

Utilizator teoionescuIonescu Teodor teoionescu Data 31 mai 2014 17:25:07
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int Nmax = 100001;
vector<int> G[Nmax];
int T[Nmax],L[Nmax],First[Nmax];
int E[2*Nmax],rmq[20][Nmax];
int N,M;
void Dfs(int x,int lev){
    E[++E[0]]=x;
    L[x]=lev;
    First[x]=E[0];
    for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it){
        Dfs(*it,lev+1);
        E[++E[0]]=x;
    }
}
int minL(int x,int y){
    if(L[x]<L[y]) return x;
    return y;
}
void Rmq(){
    for(int i=1;i<=E[0];i++) rmq[0][i]=E[i];
    for(int i=1;(1<<i)<=E[0];i++){
        for(int j=0;j+(1<<i)-1<=E[0];j++){
            rmq[i][j]=minL(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
        }
    }
}
int log(int x){
    return 31-( __builtin_clz(x) );
}
int lca(int x,int y){
    x=First[x];
    y=First[y];
    if(x>y) swap(x,y);
    int sz=y-x+1;
    int bl=(1<<log(sz));
    return minL(rmq[log(sz)][x],rmq[log(sz)][y-bl+1]);
}
int main(){
    in>>N>>M;
    for(int i=2;i<=N;i++){
        in>>T[i];
        G[T[i]].push_back(i);
    }
    Dfs(1,1);
    Rmq();
    int x,y;
    for(;M;--M){
        in>>x>>y;
        out<<lca(x,y)<<'\n';
    }
    return 0;
}