Cod sursa(job #3297329)

Utilizator Arhiva_Educationala_2Arhiva Educationala doi Arhiva_Educationala_2 Data 22 mai 2025 14:16:09
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

const int INF = 1e9;

const int MAXN = 1e5;
std::vector<int> adj[MAXN];
int par[MAXN];
int dep[MAXN];
int jump[MAXN];

void dfs( int u, int p ) {
  for( int v : adj[u] )
    if( v != p ){
      par[v] = u;
      dep[v] = 1 + dep[u];
      if( dep[u] - dep[jump[u]] == dep[jump[u]] - dep[jump[jump[u]]] )
        jump[v] = jump[jump[u]];
      else
        jump[v] = u;

      dfs( v, u );
    }
}

int lca( int a, int b ) {
  if( dep[a] < dep[b] )
    std::swap( a, b );

  while( dep[a] > dep[b] )
    if( dep[jump[a]] >= dep[b] )
      a = jump[a];
    else
      a = par[a];

  while( a != b )
    if( jump[a] != jump[b] ){
      a = jump[a];
      b = jump[b];
    }else{
      a = par[a];
      b = par[b];
    }

  return a;
}

int main() {
  FILE *fin = fopen( "lca.in", "r" );
  FILE *fout = fopen( "lca.out", "w" );

  int n, m;
  fscanf( fin, "%d%d", &n, &m );

  for( int a = 1; a < n; a++ ){
    int b;
    fscanf( fin, "%d", &b );
    b--;

    adj[a].push_back(b);
    adj[b].push_back(a);
  }

  par[0] = jump[0] = dep[0] = 0;
  dfs( 0, 0 );

  for( int i = 0; i < m; i++ ){
    int a, b;
    fscanf( fin, "%d%d", &a, &b );
    a--; b--;

    fprintf( fout, "%d\n", 1 + lca( a, b ) );
  }

  fclose( fin );
  fclose( fout );
  return 0;
}