Pagini recente » Cod sursa (job #2827922) | Cod sursa (job #2878993) | Cod sursa (job #3326419) | Cod sursa (job #1189290) | Cod sursa (job #3338355)
#include<iostream>
#include<vector>
using namespace std;
#define NMAX 100001
#define P2MAX 21
int n,q,lg[4*NMAX],rmq[P2MAX][2*NMAX],fap[NMAX],d[NMAX];
vector<int>g[NMAX],euler{0};
auto dfs(int nod,int par)->void{
d[nod]=1+d[par];
fap[nod]=euler.size();
euler.push_back(nod);
for(auto son:g[nod]){
if(son==par)continue;
dfs(son,nod);
euler.push_back(nod);
}
}
auto main(void)->signed{
#ifndef LOCAL
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
#endif // LOCAL
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
cin>>n>>q;
for(int i=2;i<=n;++i){
int x;
cin>>x;
g[x].push_back(i);
// g[i].push_back(x);
}
dfs(1,0);
n=euler.size()-1;
lg[0]=-1;
for(int i=1;i<=n;++i){
rmq[0][i]=euler[i];
lg[i]=lg[i/2]+1;
}
for(int k=1;(1<<k)<=n;++k){
for(int i=1;i+(1<<k)-1<=n;++i){
rmq[k][i]=(
d[rmq[k-1][i]]<d[rmq[k-1][i+(1<<(k-1))]]?
rmq[k-1][i]
:
rmq[k-1][i+(1<<(k-1))]
);
}
}
for(;q;--q){
int x,y;
cin>>x>>y;
x=fap[x],y=fap[y];
if(x>y)swap(x,y);
int l=lg[y-x+1];
cout<<(
d[rmq[l][x]]<d[rmq[l][y-(1<<l)+1]]?
rmq[l][x]
:
rmq[l][y-(1<<l)+1]
)<<"\n";
}
return 0;
}