Pagini recente » Cod sursa (job #2482381) | Cod sursa (job #2870807) | Cod sursa (job #2231952) | Cod sursa (job #1655691) | Cod sursa (job #1643405)
#include <cstdio>
#include <vector>
#define NMAX 100005
using namespace std;
int n,x,y,i,m;
int T2[NMAX],tata[NMAX],L[NMAX];
vector<int>v[NMAX];
int h=200;
void dfs(int nod,int tata,int niv)
{
T2[nod]=tata;L[nod]=niv;
if(niv%h == 0) tata=nod;
for(int i=0; i<=v[nod].size();++i)
dfs(v[nod][i],tata,niv+1);
}
int lca(int x,int y)
{
while(T2[x] != T2[y])
{
if(L[x] > L[y]) x=T2[x];
else y=T2[y];
}
while(x != y)
{
if(L[x] > L[y]) x=tata[x];
else y=tata[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",&tata[i]);
v[tata[i]].push_back(i);
}
dfs(1,0,0);
for(i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
int ans=lca(x,y);
printf("%d\n",ans);
}
return 0;
}