Cod sursa(job #3288122)

Utilizator pacelaaaCiurea Pavel pacelaaa Data 20 martie 2025 16:52:20
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ( "lca.in" );
ofstream fout( "lca.out" );

#define cin fin
#define cout fout
#define FR( a, b) for( int a = 0; a < b; a ++ )
#define FOR( a, c, b ) for( int a = c ; a < b;  a++ )
#define PB push_back

const int Nmax = 1e5 + 5, INF = 1e9;

int ancestor[17][Nmax], adancime[Nmax];
vector<int> sons[Nmax];
queue<int> q;

int lca( int u, int v ) {
  if( u == v )
    return u;

  for( int j = 16; j >= 0; j -- )
    if( ancestor[j][u] != 0 && ancestor[j][u] != ancestor[j][v] ) {
      u = ancestor[j][u];
      v = ancestor[j][v];
  }

  return ancestor[0][u];
}

int main()
{
    int n, queries, nod, u, v;
    cin >> n >> queries;

    FOR( i, 2, n + 1 ) {
      cin >> nod;
      ancestor[0][i] = nod;
      sons[nod].PB( i );
      adancime[i] = INF;
    }

    adancime[0] = -1;
    adancime[1] = 0;
    q.push( 1 );
    while( !q.empty() ) {
      nod = q.front();
      q.pop();

      FR( i, sons[nod].size() ) {
        int son = sons[nod][i];
        q.push( son );
        adancime[son] = adancime[nod] + 1;
      }
    }

    FOR( i, 1, 17 ) {
      FOR( nod, 2, n + 1 )
        ancestor[i][nod] = ancestor[i-1][ ancestor[i-1][nod] ];
    }

    FR( i, queries ) {
      cin >> u >> v;
      if( adancime[u] < adancime[v] )
        swap( u, v );
      for( int i = 16; i >= 0; i -- )
        if( adancime[ancestor[i][u]] >= adancime[v] )
          u = ancestor[i][u];
      cout << lca( u, v ) << "\n";
    }

    return 0;
}