Cod sursa(job #3339698)

Utilizator andrei0925Andrei Perdevara andrei0925 Data 9 februarie 2026 16:05:19
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#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;
}