Pagini recente » Cod sursa (job #1196659) | Cod sursa (job #1094424) | Cod sursa (job #886392) | Cod sursa (job #1435978) | Cod sursa (job #3304782)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int n, m, p, q, S, caut;
int t[100002], s[100002][20], niv[100002];
vector<int>L[100002];
void dfs(int nod, int nive){
niv[nod]=nive;
for(int i=0;i<L[nod].size();i++){
if(!niv[L[nod][i]]){
dfs(L[nod][i], nive+1);
}
}
}
int main() {
cin>>n>>m;
for(int i=2;i<=n;i++){
cin>>t[i];
s[i][0]=t[i];
L[t[i]].push_back(i);
}
dfs(1, 1);
for(int j=1;j<=ceil(log2(n));j++){
for(int i=1;i<=n;i++){
s[i][j]=s[s[i][j-1]][j-1];
}
}
for(int i=1;i<=m;i++){
cin>>p>>q;
if(niv[p]>niv[q])
swap(p, q);
int dif=niv[q]-niv[p];
for(int j=ceil(log2(n));j>=0;j--){
if(dif&(1<<j)){
q=s[q][j];
}
}
if(p==q){
cout<<p<<"\n";
continue;
}
for(int j=ceil(log2(n));j>=0;j--){
if(s[p][j]==s[q][j])
continue;
else{
p=s[p][j];
q=s[q][j];
}
}
caut=s[p][0];
cout<<caut<<"\n";
}
}