Cod sursa(job #2786641)

Utilizator TghicaGhica Tudor Tghica Data 21 octombrie 2021 13:02:10
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>

using namespace std;

int par[100001], s[100001][25], h[100001];

int FindRuda( int x, int h ) {
  if( h == 0 )
    return x;
  int put = 1;
  while( ( 1 << put ) <= h ) {
    put++;
  }
  put--;
  return FindRuda( s[x][put], h - ( 1 << put ) );
}

int main() {
    ifstream cin("lca.in");
    ofstream cout("lca.out");
    int n, m, i, j, a, b, st, dr, mij, x, y, last;
    cin>>n>>m;
    h[1] = 0;
    for( i = 2; i <= n; i++ ) {
      cin>>a;
      h[i] = h[a] + 1;
      s[i][0] = a;
    }
    s[1][1] = 0;
    i = 1;
    while( ( 1 << i ) <= n ) {
      for( j = 1; j <= n; j++ ) {
          s[j][i] = s[s[j][i - 1]][i - 1];
      }
      i++;
    }
    while( m-- ) {
      cin>>a>>b;
      if( h[a] < h[b] ) {
        a = FindRuda( a, h[b] - h[a] );
      } else {
        b = FindRuda( b, h[a] - h[b] );
      }
      dr = h[a];
      st = 1;
      while(st <= dr ) {
        mij = ( dr + st ) / 2;
        x = FindRuda( a, mij );
        y = FindRuda( b, mij );
        if( x == y ) {
          dr = mij - 1;
          last = x;
        } else st = mij + 1;
      }
      cout<<last<<"\n";
    }
    return 0;
}