Pagini recente » Cod sursa (job #1534163) | Cod sursa (job #2676229) | Cod sursa (job #3040862) | Cod sursa (job #902955) | Cod sursa (job #2824036)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N_MAX = 1e5 + 5;
const int LOG = 20;
int n, m;
int p[N_MAX][LOG + 5], depth[N_MAX];
vector<int> adj[N_MAX];
void dfs(int node, int d = 0)
{
depth[node] = d;
for(auto it: adj[node])
dfs(it, d + 1);
}
void precompute()
{
for(int j = 1; j <= LOG; j++)
for(int i = 1; i <= n; i++)
p[i][j] = p[p[i][j - 1]][j - 1];
dfs(1);
}
int lca(int a, int b)
{
if(depth[a] < depth[b])
swap(a, b);
int k = depth[a] - depth[b];
for(int j = LOG; j >= 0; j--)
if(k & (1 << j))
a = p[a][j];
if(a == b)
return a;
for(int j = LOG; j >= 0; j--)
{
if(p[a][j] != p[b][j])
{
a = p[a][j];
b = p[b][j];
}
}
return p[a][0];
}
int main()
{
in >> n >> m;
p[1][0] = 1;
for(int i = 2; i <= n; i++)
{
in >> p[i][0];
adj[p[i][0]].push_back(i);
}
precompute();
while(m--)
{
int x, y;
in >> x >> y;
out << lca(x, y) << '\n';
}
return 0;
}