Pagini recente » Cod sursa (job #1669770) | Cod sursa (job #533941) | Cod sursa (job #766357) | Cod sursa (job #653766) | Cod sursa (job #2495412)
#include <bits/stdc++.h>
using namespace std;
int n,m;
vector<int>v[100005];
int mod;
int h[100005],sqh[100005],t[100005],sqt[100005];
void dfs(int nod)
{
vector<int>::iterator it;
for(it=v[nod].begin();it!=v[nod].end();it++)
{
int l=*it;
h[l]=h[nod]+1;
sqh[l]=h[l]/mod;
t[l]=nod;
sqt[l]=sqt[nod];
if(h[l]%mod==0)
{
sqt[l]=nod;
}
dfs(l);
}
}
int f(int a,int b)
{
if(h[a]>h[b])swap(a,b);
if(a==b)return a;
return f(a,t[b]);
}
int sqf(int a,int b)
{
if(h[a]>h[b])swap(a,b);
if(a==b)return a;
if(sqt[a]!=sqt[b])
return sqf(a,sqt[b]);
return f(a,b);
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
mod=sqrt((double)n);
int i;
for(i=2;i<=n;i++)
{
int a;
scanf("%d",&a);
v[a].push_back(i);
}
h[1]=1;
sqh[1]=0;
t[1]=0;
sqt[1]=0;
dfs(1);
for(i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",sqf(a,b));
}
return 0;
}