Pagini recente » Cod sursa (job #814532) | Cod sursa (job #790294) | Cod sursa (job #3342941) | Cod sursa (job #825922) | Cod sursa (job #3339698)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int N, Q, up[100005][25], start, X, Y, time_in[100005], time_out[100005], time_curr, l;
vector <int> G[100005];
void dfs(int x)
{
time_in[x] = ++time_curr;
for(int i = 1; i <= l; i++)
up[x][i] = up[up[x][i - 1]][i - 1];
for(auto e : G[x])
if( e != up[x][0] )
dfs(e);
time_out[x] = ++time_curr;
}
is_ancestor(int x, int y){
return time_in[x] <= time_in[y] and time_out[y] <= time_out[x];
}
int LCA(int x, int y)
{
if(is_ancestor(x, y))
return x;
if(is_ancestor(y, x))
return y;
for(int i = l; i >= 0; i--)
if( up[x][i] and !is_ancestor(up[x][i], y))
x = up[x][i];
return up[x][0];
}
int main()
{
cin >> N >> Q;
l = log2(N) + 1;
for(int i = 2; i <= N; i++)
{
cin >> up[i][0];
G[up[i][0]].push_back(i);
}
dfs(1);
for(int q = 1; q <= Q; q++)
{
cin >> X >> Y;
cout << LCA(X , Y) << '\n';
}
return 0;
}