Pagini recente » Cod sursa (job #1022369) | Cod sursa (job #576139) | Cod sursa (job #1989649) | Cod sursa (job #1872454) | Cod sursa (job #3141610)
#include <fstream>
#include <vector>
#define MAX 100000
#define LOG 20
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
vector <int> graph[MAX + 10];
int level[MAX + 10], ancestor[LOG + 10][MAX + 10];
void dfs(int node, int parent)
{
level[node] = level[parent] + 1;
ancestor[0][node] = parent;
for (auto next : graph[node])
if (next != parent)
dfs(next, node);
}
int lca(int x, int y)
{
if (level[x] < level[y])
swap(x, y);
int diff = level[x] - level[y];
for (int p = LOG; p >= 0; p--)
if (diff >> p & 1)
x = ancestor[p][x];
if (x == y)
return x;
for (int p = LOG; p >= 0; p--)
if (ancestor[p][x] != 0 && ancestor[p][y] != 0 && ancestor[p][x] != ancestor[p][y])
{
x = ancestor[p][x];
y = ancestor[p][y];
}
return ancestor[0][x];
}
int main()
{
int n, q;
cin >> n >> q;
for (int i = 2; i <= n; i++)
{
int x;
cin >> x;
graph[x].push_back(i);
graph[i].push_back(x);
}
dfs(1, 0);
for (int p = 1; p <= LOG; p++)
for (int node = 1; node <= n; node++)
ancestor[p][node] = ancestor[p - 1][ancestor[p - 1][node]];
for (int i = 1; i <= q; i++)
{
int x, y;
cin >> x >> y;
cout << lca(x, y) << '\n';
}
return 0;
}