Pagini recente » Cod sursa (job #615508) | Cod sursa (job #3327121) | Cod sursa (job #2465022) | Cod sursa (job #1918489) | Cod sursa (job #3326933)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int EMAX=17, NMAX=1e5+1;
int n, m;
int lvl[NMAX], t[EMAX][NMAX], lg[NMAX];
vector <int> g[NMAX];
void dfs(int nod, int h){
lvl[nod]=h;
for(int f : g[nod]){
t[0][f]=nod;
dfs(f, h+1);
}
}
int anc(int nod, int ord){
int e=0;
while(ord){
if(ord%2)
nod=t[e][nod];
ord/=2;
e++;
}
return nod;
}
int lca(int x, int y){
int e=lg[lvl[x]];
while(e>=0){
if(t[e][x]!=t[e][y]){
x=t[e][x];
y=t[e][y];
}
e--;
}
return t[0][x];
}
int main(){
fin>>n>>m;
int x;
for(int i=1;i<n;i++){
fin>>x;
g[x].push_back(i+1);
}
dfs(1, 1);
for(int i=2;i<=n;i++){
lg[i]=lg[i/2]+1;
}
for(int e=1;e<EMAX;e++){
for(int i=1;i<=n;i++){
t[e][i]=t[e-1][t[e-1][i]];
}
}
while(m--){
int x, y;
fin>>x>>y;
if(lvl[x]>lvl[y])
swap(x,y);
y=anc(y, lvl[y]-lvl[x]);
if(y==x)
fout<<x<<'\n';
else
fout<<lca(x, y)<<'\n';
}
return 0;
}