Cod sursa(job #1193381)

Utilizator teoionescuIonescu Teodor teoionescu Data 31 mai 2014 17:02:01
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 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];
int smen[20][Nmax];
int N,M;
void Dfs(int x,int lev){
    L[x]=lev;
    for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it) Dfs(*it,lev+1);
}
void jump(int& x,int e){
    for(int k=0;(1<<k)<=e;k++){
        if(e&(1<<k)) x=smen[k][x];
    }
}
int lca(int x,int y){
    if(L[y]>L[x]) swap(x,y);
    jump(x,L[x]-L[y]);
    if(x==y) return x;
    for(int pas=19;pas>=0;pas--){
        if(smen[pas][x]!=smen[pas][y]){
            x=smen[pas][x];
            y=smen[pas][y];
        }
    }
    return T[x];
}
int main(){
    in>>N>>M;
    for(int i=2;i<=N;i++){
        in>>T[i];
        G[T[i]].push_back(i);
    }
    Dfs(1,1);
    for(int i=1;i<=N;i++) smen[0][i]=T[i];
    for(int i=1;i<=N;i++) for(int k=0;smen[k][i];k++) smen[k+1][i]=smen[k][ smen[k][i] ];
    int x,y;
    for(;M;--M){
        in>>x>>y;
        out<<lca(x,y)<<'\n';
    }
    return 0;
}