Cod sursa(job #1377070)

Utilizator teoionescuIonescu Teodor teoionescu Data 5 martie 2015 19:57:54
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int bsize=1<<10; int pos=bsize;
char buff[bsize];
inline bool rable(char &c){return ('0'<=c && c<='9');}
void Read(int &x){
    x=0;if(pos>=bsize){in.read(buff,bsize);pos=0;}
    while(!rable(buff[pos])){pos++;if(pos>=bsize){in.read(buff,bsize);pos=0;}}
    while(rable(buff[pos])){x=x*10+int(buff[pos++])-'0';if(pos>=bsize){in.read(buff,bsize);pos=0;}}
}
const int Nmax = 100001;
vector<int> G[Nmax];
int T[Nmax],sm[21][Nmax];
int L[Nmax];
int N,M;
int lca(int x,int y){
    if(L[x]>L[y]) swap(x,y);
    int h=L[y]-L[x];
    for(int k=0;(1<<k)<=h;k++) if((1<<k)&h) y=sm[k][y];
    if(x==y) return x;
    int pas=20;
    while(pas>=0){
        if(sm[pas][x]!=sm[pas][y]){
            x=sm[pas][x];
            y=sm[pas][y];
        }
        pas--;
    }
    return T[x];
}
void dfs(int x,int l){
    L[x]=l;
    sm[0][x]=T[x];
    for(int k=1;sm[k-1][x];k++) sm[k][x]=sm[k-1][sm[k-1][x]];
    for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it) if(!L[*it]) dfs(*it,l+1);
}
int main(){
    Read(N),Read(M);
    for(int i=2;i<=N;i++){
        Read(T[i]);
        G[T[i]].push_back(i);
    }
    dfs(1,1); int x,y;
    while(M--){
        Read(x),Read(y);
        out<<lca(x,y)<<'\n';
    }
    return 0;
}