Pagini recente » Cod sursa (job #2869910) | Cod sursa (job #1896030) | Cod sursa (job #630692) | Cod sursa (job #1903819) | Cod sursa (job #3273222)
#include <iostream>
#include <ctgmath>
#include <vector>
#define NMAX 100000
using namespace std;
int n, q, x, y, k = 0;
int rmq[17][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 = rmq[p2][x];
if(height[rez] > height[rmq[p2][y - (1 << p2) + 1]])
rez = 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++)
{
int step = (1 << i);
for(int j = 1; j + step <= k; j++)
{
rmq[i][j] = rmq[i - 1][j];
if(height[rmq[i][j]] > height[rmq[i-1][j+1]])
rmq[i][j] = rmq[i - 1][j + 1]; //lol
}
}
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;
}