Pagini recente » Cod sursa (job #771695) | Cod sursa (job #1715984) | Cod sursa (job #669538) | Cod sursa (job #3217607) | Cod sursa (job #1411645)
#include <bits/stdc++.h>
#define N 100005
#define pb push_back
using namespace std;
int rmq[18][1 << 18], niv[N], apar[N], cnt, n, m, i, x, y, a[N], j, nn, lv;
vector<int>v[N];
void df(int nod, int tata)
{
niv[nod] = niv[tata] + 1;
rmq[0][++cnt] = nod;
apar[nod] = cnt;
for(auto it : v[nod])
{
df(it, nod);
rmq[0][++cnt] = nod;
}
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i = 2; i <= n; i++)
{
scanf("%d", &x);
v[x].pb(i);
}
df(1, 0);
for(i = 2; i <= cnt; i <<= 1)
a[i] = 1;
for(i = 2; i <= cnt; i++)
a[i] += a[i - 1];
nn = a[cnt];
for(i = 1; i <= nn; i++)
for(j = 1; j <= cnt - (1 << i) + 1; j++)
rmq[i][j] = niv[rmq[i - 1][j]] < niv[rmq[i - 1][j + (1 << (i - 1))]] ? rmq[i - 1][j] : rmq[i - 1][j + (1 << (i - 1))];
for(; m; m--)
{
scanf("%d%d", &x, &y);
if(apar[x] > apar[y])
swap(x, y);
x = apar[x];
y = apar[y];
lv = a[y - x + 1];
niv[rmq[lv][x]] < niv[rmq[lv][y - (1 << lv) + 1]] ? printf("%d\n",rmq[lv][x]) : printf("%d\n",rmq[lv][y - (1 << lv) + 1]);
}
return 0;
}