Pagini recente » Cod sursa (job #2439803) | Cod sursa (job #1196115) | Cod sursa (job #962936) | Cod sursa (job #1822898) | Cod sursa (job #2942480)
#include<cstdio>
#include<algorithm>
#include<vector>
#define nmax 100005
using namespace std;
static int h=200;
int m,n,i,j,k,a[nmax],x,y,tata[15],niv[nmax];
vector<int>v[nmax];
void dfs(int nod,int n1,int lev)
{
niv[nod]=lev;
if (lev%h==0) n1=nod;
tata[nod]=n1;
for (int j=0;j<v[nod].size();j++)
dfs(v[nod][j],n1,lev+1);
}
int lca(int x,int y)
{
while (tata[x]!=tata[y])
if (niv[x]>niv[y]) x=tata[x];else y=tata[y];
while (x!=y)
if (niv[x]>niv[y]) x=a[x];else y=a[y];
return x;
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
for (i=2;i<=n;i++)
{
scanf("%d",&a[i]);
v[a[i]].push_back(i);
}
dfs(1,0,0);
for (i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
printf("%d\n",lca(x,y));
}
return 0;
}