Pagini recente » Cod sursa (job #2376627) | Cod sursa (job #1701102) | Cod sursa (job #594702) | Cod sursa (job #211822) | Cod sursa (job #1758203)
#include <cstdio>
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;
const int nmx = 100002;
int n,m;
vector <int> g[nmx];
int pos[2*nmx], t;
pair <int,int> dp[20][2*nmx], euler[2*nmx];
void citire()
{
scanf("%d %d", &n ,&m);
for(int i = 2; i <= n; ++i)
{
int nod;
scanf("%d", &nod);
g[nod].push_back(i);
}
}
void dfs(int nod, int niv)
{
euler[++t] = make_pair(niv,nod);
pos[nod] = t;
for(vector<int>::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
{
dfs(*it,niv+1);
euler[++t] = make_pair(niv,nod);
}
}
void rmq()
{
for(int i = 1; i <= t; ++i)
dp[0][i] = euler[i];
for(int i = 1; (1 << i) <= t; ++i)
for(int j = 1; j + (1 << i) <= t + 1; ++j)
dp[i][j] = min(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
}
void answers()
{
for(int i = 1; i <= m; ++i)
{
int nod1,nod2;
scanf("%d %d", &nod1, &nod2);
nod1 = pos[nod1];
nod2 = pos[nod2];
if(nod1 > nod2)
swap(nod1,nod2);
int pt2 = log2(nod2-nod1+1);
pair <int,int> an = min(dp[pt2][nod1],dp[pt2][nod2-(1<<pt2)+1]);
printf("%d\n", an.second);
}
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
citire();
dfs(1,0);
rmq();
answers();
return 0;
}