Pagini recente » Cod sursa (job #172125) | Cod sursa (job #125753) | Cod sursa (job #2444203) | Cod sursa (job #1361197) | Cod sursa (job #3170100)
#include <fstream>
using namespace std;
const int Nmax = 100005;
int rmq[17][Nmax];
int level[Nmax];
int n, m;
int go_up(int nod, int steps)
{
for(int i = 16; i>=0; i--)
if((1 << i) <= steps)
{
nod = rmq[i][nod];
steps -= (1<<i);
}
return nod;
}
int find_level(int nod)
{
if(level[nod])
return level[nod];
level[nod] = 1 + find_level(rmq[0][nod]);
return level[nod];
}
int main()
{
ifstream cin("lca.in");
ofstream cout("lca.out");
cin >> n >> m;
for(int i = 2; i<=n; i++)
{
cin >> rmq[0][i];
}
level[1] = 1;
for(int i = 2; i <= n; i++)
level[i] = find_level(i);
for(int i = 1; i < 17; i++)
for(int nod = 1; nod <= n; nod++)
rmq[i][nod] = rmq[i-1][rmq[i-1][nod]];
while(m--)
{
int x, y;
cin >> x >> y;
if(level[y] < level[x])
{
swap(x, y);
}
y = go_up(y, level[y] - level[x]);
if(x == y)
{
cout << x << '\n';
continue;
}
for(int i = 16; i>=0; i--)
if(rmq[i][x] != rmq[i][y])
{
x = rmq[i][x];
y = rmq[i][y];
}
cout << rmq[0][x] << '\n';
}
}