Pagini recente » Cod sursa (job #93589) | Cod sursa (job #3227979) | Cod sursa (job #713478) | Cod sursa (job #235599) | Cod sursa (job #1649764)
#include <bits/stdc++.h>
#define Nmax 100005
#define pb push_back
using namespace std;
int n,lvl[Nmax],l,rmq[2*Nmax][20],Lg[2*Nmax],p[Nmax];
vector <int> L[Nmax];
inline void Dfs(int nod, int tata)
{
rmq[++l][0]=nod; p[nod]=l;
for(auto it : L[nod])
{
if(it==tata) continue;
lvl[it]=lvl[nod]+1;
Dfs(it,nod);
rmq[++l][0]=nod;
}
}
inline void RMQ()
{
int i,j;
for(j=1;j<20;++j)
for(i=1;i<=l-(1<<j)+1;++i)
if(lvl[rmq[i][j-1]]<lvl[rmq[i+(1<<(j-1))][j-1]]) rmq[i][j]=rmq[i][j-1];
else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
for(i=2;i<=l;++i) Lg[i]=Lg[(i>>1)]+1;
}
inline int Lca(int x, int y)
{
x=p[x]; y=p[y];
if(x>y) swap(x,y);
int t=Lg[y-x+1];
if(lvl[rmq[x][t]]<lvl[rmq[y-(1<<t)+1][t]]) return rmq[x][t];
return rmq[y-(1<<t)+1][t];
}
int main()
{
int i,x,m,y;
ifstream cin("lca.in");
ofstream cout("lca.out");
cin>>n>>m;
for(i=2;i<=n;++i)
{
cin>>x;
L[x].pb(i); L[i].pb(x);
}
Dfs(1,0);
RMQ();
while(m--)
{
cin>>x>>y;
cout<<Lca(x,y)<<"\n";
}
return 0;
}