Pagini recente » Cod sursa (job #150280) | Cod sursa (job #3279861) | Cod sursa (job #1906987) | Cod sursa (job #2919447) | Cod sursa (job #3214078)
#include <fstream>
#include <vector>
#define MAX 100000
#define LOG 20
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
int level[MAX + 10], ancestor[LOG + 10][MAX + 10];
vector <int> graph[MAX + 10];
void dfs(int node, int parent)
{
level[node] = level[parent] + 1;
ancestor[0][node] = parent;
for (const 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] != ancestor[p][y] && ancestor[p][x] != 0 && ancestor[p][y] != 0)
{
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 dad;
cin >> dad;
graph[i].push_back(dad);
graph[dad].push_back(i);
}
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;
}