Pagini recente » Cod sursa (job #3335741) | Cod sursa (job #1190604) | Cod sursa (job #1198399) | Cod sursa (job #19890) | Cod sursa (job #3339708)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int N, Q, l, up[100005][25], X, Y, time_in[100005], time_out[100005], time_curr;
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;
}
int 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);
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;
}