Pagini recente » Cod sursa (job #2002019) | Cod sursa (job #1290293) | Cod sursa (job #2470904) | Cod sursa (job #1584161) | Cod sursa (job #2398055)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
#define NMAX 100005
vector <int>v[NMAX];
int rmq[22][NMAX<<2],depth[NMAX<<1],n,m,first[NMAX],last,euler[NMAX<<1],Lg[NMAX<<1];
void bfs(int node,int papa){
euler[++last]=node;
depth[node]=depth[papa]+1;
first[node]=last;
for(auto y:v[node]){
if(y!=papa){
bfs(y,node);
euler[++last]=node;
}
}
}
void build_rmq(){
for(int i=2;i<=last;i++)
Lg[i]=Lg[i>>1]+1;
for(int i=0;i<last;i++)
rmq[0][i]=euler[i];
for(int j=1;(1<<j)<=last;j++)
for(int i=1;i+(1<<(j-1))-1<=last;i++){
if(depth[rmq[j-1][i]]<depth[rmq[j-1][i+(1<<(j-1))]])
rmq[j][i]=rmq[j-1][i];
else
rmq[j][i]=rmq[j-1][i+(1<<(j-1))];
}
}
int interogare(int st,int dr){
int i=first[st];
int j=first[dr];
if(i>j)
swap(i,j);
int power=Lg[j-i+1];
if(depth[rmq[power][i]]<depth[rmq[power][j-(1<<power)+1]])
return rmq[power][i];
return rmq[power][j-(1<<power)+1];
}
int main()
{
in>>n>>m;
for(int i=2;i<=n;i++){
int papa;
in>>papa;
v[papa].push_back(i);
}
depth[0]=-1;
bfs(1,0);
build_rmq();
for(int j=1;j<=m;j++){
int st,dr;
in>>st>>dr;
out<<interogare(st,dr)<<'\n';
}
return 0;
}