Pagini recente » Cod sursa (job #1167925) | Cod sursa (job #1769247) | Cod sursa (job #2950360) | Cod sursa (job #1913066) | Cod sursa (job #1883973)
#include <cstdio>
#include <vector>
#define BIT(x) (1<<(x))
using namespace std;
struct rec
{
int vmin, pmin;
} v[300001][20];
vector<int> g[100001];
int pos[100001];
int lv, n, m;
int dfs(int nod, int nivel)
{
pos[nod] = lv;
v[lv][0].vmin = nivel;
v[lv][0].pmin = nod;
lv++;
for(int i = 0; i < g[nod].size(); i++)
{
dfs(g[nod][i], nivel + 1);
v[lv][0].vmin = nivel;
v[lv][0].pmin = nod;
lv++;
}
}
int main()
{
int i, a, b, j;
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i = 2; i <= n; i++)
{
scanf("%d", &a);
g[a].push_back(i);
}
dfs(1, 0);
for(j = 1; BIT(j) <= lv; j++)
{
for(i = 0; i <= lv - BIT(j - 1); i++)
{
if(v[i][j - 1].vmin < v[i + BIT(j - 1)][j - 1].vmin)
v[i][j] = v[i][j - 1];
else v[i][j] = v[i + BIT(j - 1)][j - 1];
}
}
while(m--)
{
scanf("%d%d", &a, &b);
a = pos[a];
b = pos[b];
if(a > b)
swap(a, b);
int dim, dif = b - a;
for(dim = 19; BIT(dim) > dif; dim--);
if(v[a][dim].vmin < v[b - BIT(dim) + 1][dim].vmin)
printf("%d\n", v[a][dim].pmin);
else printf("%d\n", v[b - BIT(dim) + 1][dim].pmin);
}
return 0;
}