Pagini recente » Cod sursa (job #2473472) | Cod sursa (job #504238) | Cod sursa (job #1587264) | Cod sursa (job #647729) | Cod sursa (job #1697537)
#include <stdio.h>
#include <vector>
using namespace std;
int n,m,i,e[200001],nr,t,f[100001],niv[100001],x,y,r[200001][20],lg[200001];
bool o[100001];
vector<int> G[100001];
void DFS(int s)
{
int i,z=G[s].size();
o[s]=1;
e[++nr]=s; f[s]=nr;
for (i=0;i<z;i++)
if (!o[G[s][i]])
{
niv[G[s][i]]=niv[s]+1;
DFS(G[s][i]);
e[++nr]=s;
}
}
void init()
{
int i;
scanf("%i%i",&n,&m);
for (i=2;i<=n;i++)
{
scanf("%i",&t);
G[t].push_back(i);
G[i].push_back(t);
}
DFS(1);
}
void rmq()
{
int i,j,p=1;
for (i=1;i<=nr;i++) r[i][0]=e[i];
for (j=1;p<=nr;j++,p<<=1)
for (i=1;i<=nr-p+1;i++)
if (niv[r[i][j-1]]<niv[r[i+p][j-1]])
r[i][j]=r[i][j-1];
else r[i][j]=r[i+p][j-1];
j=1; p=1;
for (i=-1;j<=nr;j++)
{
if (j==p) i++,p<<=1;
lg[j]=i;
}
}
int lca(int a,int b)
{
int l=lg[b-a+1];
if (niv[r[a][l]]<niv[r[b-(1<<l)+1][l]])
return r[a][l];
return r[b-(1<<l)+1][l];
}
int main()
{
freopen ("lca.in","r",stdin);
freopen ("lca.out","w",stdout);
init();
rmq();
while (m--)
{
scanf("%i%i",&x,&y);
printf("%i\n",lca(min(f[x],f[y]),max(f[x],f[y])));
}
fclose(stdin);
fclose(stdout);
return 0;
}