Pagini recente » Cod sursa (job #2110233) | Cod sursa (job #1839473) | Cod sursa (job #3030381) | Cod sursa (job #937320) | Cod sursa (job #1345441)
#include <cstdio>
#include <vector>
#define NMAX 100005
using namespace std;
int n, m, h=200;
int T2[NMAX],T[NMAX],L[NMAX];
vector<int>v[NMAX];
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=T[x];
else y=T[y];
}
return x;
}
void citire()
{
freopen("lca.in", "r", stdin);
scanf("%d%d",&n,&m);
for(int i = 2; i <= n; ++i)
{
scanf("%d",&T[i]);
v[T[i]].push_back(i);
}
dfs(1,0,0);
}
void query()
{
int x,y;
freopen("lca.out", "w", stdout);
for(int i = 1; i <= m; ++i)
{
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
}
int main()
{
citire();
query();
return 0;
}