Pagini recente » Cod sursa (job #2097197) | Cod sursa (job #819344) | Cod sursa (job #2719932) | Cod sursa (job #2073809) | Cod sursa (job #2571189)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int NMAX=100005;
int n,m,rmq[20][NMAX],depth[NMAX],euler[NMAX<<1],cnt,first[NMAX],lg[NMAX<<1];
bool seen[NMAX];
vector<int>g[NMAX];
int dfs(int node,int l){
depth[node]=l;
first[node]=++cnt;
euler[cnt]=node;
for(auto y:g[node]){
dfs(y,l+1);
euler[++cnt]=node;
}
}
void build_rmq(){
for(int i=2;i<=cnt;i++)
lg[i]=lg[i>>1]+1;
for(int i=0;i<=cnt;i++)
rmq[0][i]=euler[i];
for(int i=1;i<=19;i++)
for(int j=1;j+(1<<(i-1))-1<=cnt;j++)
if(depth[rmq[i-1][j]]<depth[rmq[i-1][j+(1<<(i-1))]])
rmq[i][j]=rmq[i-1][j];
else
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
int ans(int a,int b){
int x=first[a],y=first[b];
if(x>y)
swap(x,y);
int l=lg[y-x+1],rasp=rmq[l][x];
if(depth[rmq[l][x]]>depth[rmq[l][y-(1<<l)+1]])
rasp=rmq[l][y-(1<<l)+1];
return rasp;
}
int main()
{
in>>n>>m;
for(int i=2,a;i<=n;i++){
in>>a;
g[a].push_back(i);
}
depth[0]=-1;
dfs(1,0);
build_rmq();
for(int i=1,a,b;i<=m;i++){
in>>a>>b;
out<<ans(a,b)<<'\n';
}
return 0;
}