Pagini recente » Cod sursa (job #23406) | Cod sursa (job #2875379) | Cod sursa (job #2186501) | Cod sursa (job #1849799) | Cod sursa (job #1920582)
#include <bits/stdc++.h>
using namespace std;
int dp[22][200000],i,n,nrt,j,k,logy[200005],x,y,nr,first[100005],ll;
vector <int> v[100004];
struct andreea
{
int niv, node;
}vect[200000];
void dfs(int nod, int lev)
{
int i;
nr++;
vect[nr].node=nod;
vect[nr].niv=lev;
first[nod]=nr;
for(i=0;i<v[nod].size();i++)
{
dfs(v[nod][i],lev+1);
nr++;
vect[nr].node=nod;
vect[nr].niv=lev;
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&nrt);
for(i=2;i<=n;i++)
{
scanf("%d",&x);
v[x].push_back(i);
}
dfs(1,0);
for(i=2;i<=nr;i++)
logy[i]=logy[i/2]+1;
for(i=1;i<=nr;i++)
dp[0][i]=i;
for(i=1;(1<<i)<=nr;i++)
{
for(j=1;j+(1<<(i-1))<=nr;j++)
{
ll=1<<(i-1);
if(vect[dp[i-1][j]].niv<vect[dp[i-1][j+ll]].niv)dp[i][j]=dp[i-1][j];
else dp[i][j]=dp[i-1][j+ll];
}
}
for(i=1;i<=nrt;i++)
{
scanf("%d%d",&x,&y);
x=first[x];
y=first[y];
if(x>y)swap(x,y);
k=logy[y-x+1];
if(vect[dp[k][x]].niv<vect[dp[k][y-(1<<k)+1]].niv)printf("%d\n",vect[dp[k][x]].node);
else printf("%d\n",vect[dp[k][y-(1<<k)+1]].node);
}
return 0;
}