Pagini recente » Cod sursa (job #1665859) | Cod sursa (job #2722971) | Cod sursa (job #1883277) | Cod sursa (job #2444328) | Cod sursa (job #2925967)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int MAXN=100000;
const int LOGN=20;
int timpin[MAXN],timpout[MAXN],timp,n,m,tati[MAXN],l,visit[MAXN];
vector <int> g[MAXN];
pair <int,int> e[20*MAXN],rmq[LOGN][MAXN];
void dfs (int nod, int nivel){
if (visit[nod]>0)
return;
e[++l]={nod,nivel};
visit[nod]=l;
for (int i=0;i<g[nod].size ();++i){
if (visit[g[nod][i]]==0){
dfs (g[nod][i],nivel+1);
e[++l]={nod,nivel};
}
}
}
int main(){
fin >>n>>m;
for (int i=1;i<=n-1;++i){
int x;
fin >>x;
tati[i+1]=x;
g[x].push_back (i+1);
}
dfs (1,0);
/*for (int i=1;i<=l;++i)
fout <<e[i].first<<' '<<e[i].second<<'\n';
for (int i=1;i<=n;++i)
fout <<visit[i]<<' ';*/
for (int i=1;i<=l;++i)
rmq[0][i]=e[i];
for (int i=1;i<19;++i){
for (int j=1;j+(1<<i)-1<=l;++j){
if (rmq[i-1][j].second<rmq[i-1][j+(1<<(i-1))].second)
rmq[i][j]=rmq[i-1][j];
else
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
}
for (int i=1;i<=m;++i){
int x,y,a,b,l,kl,p=0;
fin >>x>>y;
a=visit[x];
b=visit[y];
if (a>b)
swap (a,b);
kl=l=b-a+1;
while (kl>1){
kl/=2;
p++;
}
if (rmq[p][a].second>rmq[p][b-(1<<p)+1].second)
fout <<rmq[p][b-(1<<p)+1].first<<'\n';
else
fout <<rmq[p][a].first<<'\n';
}
fin.close ();
fout.close ();
return 0;
}