Pagini recente » Cod sursa (job #442106) | Cod sursa (job #1457672) | Cod sursa (job #1659798) | Cod sursa (job #3130336) | Cod sursa (job #3183157)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int MAXN=1e5+5;
vector <int> G[MAXN];
int r[20*MAXN], tata[MAXN], rmq[50][20*MAXN], v[MAXN], k, n, m, t=1, grad[MAXN], e[20*MAXN], x, a, b, nod[50][20*MAXN];
void dfs (int i){
v[i]=t;
r[t]=grad[i];
nod[0][t]=i;
t++;
for (int u=0;u<G[i].size();++u){
if (v[G[i][u]]==0){
grad[G[i][u]]=grad[i]+1;
dfs(G[i][u]);
r[t]=grad[i];
nod[0][t]=i;
t++;
}
}
}
void precalc(){
for (int i=1;i<t;++i){
rmq[0][i]=r[i];
}
for (int i=1;(1<<i)<t;++i){
for (int j=1;j+(1<<i)-1<t;++j){
if (rmq[i-1][j]<rmq[i-1][j+(1<<(i-1))]){
rmq[i][j]=rmq[i-1][j];
nod[i][j]=nod[i-1][j];
}
else{
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
nod[i][j]=nod[i-1][j+(1<<(i-1))];
}
}
}
}
int main()
{
fin>>n>>m;
for (int i=1;i<n;++i){
fin>>tata[i+1];
G[tata[i+1]].push_back(i+1);
}
grad[1]=1;
dfs(1);
precalc();
for (int i=1;i<t;++i){
e[i]=e[i/2]+1;
}
for (int i=1;i<=m;++i){
fin>>a>>b;
a=v[a];
b=v[b];
if (a>b)
swap(a, b);
k=e[b-a+1]-1;
x=min(rmq[k][a], rmq[k][b-(1<<k)+1]);
if (rmq[k][a]<rmq[k][b-(1<<k)+1]){
fout<<nod[k][a]<<'\n';
}
else{
fout<<nod[k][b-(1<<k)+1]<<'\n';
}
//cout<<abs(x-r[a])+abs(x-r[b])<<'\n';
}
return 0;
}