Pagini recente » Cod sursa (job #612789) | Cod sursa (job #2440587) | Cod sursa (job #1888516) | Cod sursa (job #1128011) | Cod sursa (job #3211395)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n,m,first[200001],E[200001];
ifstream fin("lca.in");
ofstream fout("lca.out");
struct abc{
int nod; int lvl;
}r[20][200001];
int k = 0;
vector<int>G[200001];
void dfs(int nod,int lvl){
r[0][++k]={nod,lvl};
first[nod]=k;
for(auto x : G[nod])
{
dfs(x,lvl+1);
r[0][++k]={nod,lvl};
}
}
int main(){
fin>>n>>m;
for(int i=2;i<=n;i++){
int x; fin>>x;
G[x].push_back(i);
}
dfs(1,1);
for(int i=2;i<=k;i++)
E[i]=E[i/2]+1;
for(int p=1;(1<<p)<=k;p++)
for(int i=1;i<=k;i++){
r[p][i]=r[p-1][i];
int j = i +(1<<(p-1));
if(j<=k && r[p-1][j].lvl<r[p-1][i].lvl)
r[p][i]=r[p-1][j];
}
while(m--){
int st,dr; fin>>st>>dr;
if(first[st]>first[dr])
swap(st,dr);
st = first[st];
dr = first[dr];
int e = E[dr-st+1];
int len = (1<<e);
if(r[e][st].lvl<r[e][dr-len+1].lvl)
fout<<r[e][st].nod<<'\n';
else
fout<<r[e][dr-len+1].nod<<'\n';
}
return 0;
}