Pagini recente » Cod sursa (job #1236651) | Cod sursa (job #768314) | Cod sursa (job #192322) | Cod sursa (job #1162089) | Cod sursa (job #3220378)
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100002
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n, q, k, dad[NMAX], rmq[20][NMAX], log2[NMAX], depth[NMAX], poz[NMAX];
vector<int> G[NMAX];
void citire()
{
fin >> n >> q;
for (int i = 2; i <= n; i++)
{
fin >> dad[i];
G[dad[i]].push_back(i);
}
dad[1] = 1;
}
void dfs(int nod)
{
poz[nod] = k;
rmq[0][k++] = nod;
depth[nod] = depth[dad[nod]] + 1;
for (auto it : G[nod])
{
dfs(it);
rmq[0][k++] = nod;
}
}
int main()
{
citire();
dfs(1); // path eulerian
/// construim rmq
for (int i = 1; (1<<i) < k; i++)
{
for (int j = 0; j+(1<<i) < k; j++)
{
if (depth[rmq[i-1][j]] < depth[rmq[i-1][j+(1<<(i-1))]])
rmq[i][j] = rmq[i-1][j];
else
rmq[i][j] = rmq[i-1][j+(1<<(i-1))];
}
}
/// queries
log2[1] = 0;
for (int i = 2; i <= n; i++)
log2[i] = log2[(i>>1)] + 1;
for (int i = 1; i <= q; i++)
{
int x, y;
fin >> x >> y;
x = poz[x]; y = poz[y];
if (x > y) swap(x, y);
int level = log2[y - x + 1];
if (depth[rmq[level][x]] < depth[rmq[level][y-(1<<level)+1]])
fout << rmq[level][x] << "\n";
else
fout << rmq[level][y-(1<<level)+1] << "\n";
}
return 0;
}