Pagini recente » Cod sursa (job #2461663) | Cod sursa (job #1682427) | Cod sursa (job #746879) | Cod sursa (job #485570) | Cod sursa (job #3273374)
#include <iostream>
#include <ctgmath>
#include <vector>
#define NMAX 100000
using namespace std;
int n, q, x, y, k = 0;
int rmq[20][2 * NMAX + 2];
int pma[NMAX + 2];
vector<int> adc[NMAX + 2];
int height[NMAX + 2];
void dfse(int v, int h)
{
rmq[0][++k] = v;
pma[v] = k;
height[v] = h;
for(auto it : adc[v])
{
dfse(it, h+1);
rmq[0][++k] = v;
}
}
int rmqPr(int x, int y)
{
if(x > y)
swap(x, y);
int sz = y - x + 1;
int p2 = int(log2(sz));
int rez = (height[rmq[p2][x]] < height[rmq[p2][y - (1 << p2) + 1]] ? rmq[p2][x] : rmq[p2][y - (1 << p2) + 1]);
return rez;
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d %d", &n, &q);
for(int i = 2; i <= n; i++)
{
scanf("%d", &x);
adc[x].push_back(i);
}
dfse(1, 0);
int lgb = int(log2(k));
for(int i = 1; i <= lgb; i++)
for(int j = 1; j <= k - (1 << i) + 1; j++)
rmq[i][j] = (height[rmq[i - 1][j]] < height[rmq[i - 1][j + (1 << (i - 1))]] ? rmq[i - 1][j] : rmq[i - 1][j + (1 << (i - 1))]);
for(int i = 1; i <= q; i++)
{
scanf("%d %d", &x, &y);
int res = rmqPr(pma[x], pma[y]);
printf("%d\n", res);
}
return 0;
}