Pagini recente » Cod sursa (job #2492768) | Cod sursa (job #1953119) | Cod sursa (job #622354) | Cod sursa (job #310570) | Cod sursa (job #1193383)
#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;
}