Cod sursa(job #3237692)

Utilizator tsg38Tsg Tsg tsg38 Data 11 iulie 2024 20:57:19
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

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

const int DIM = 1e5 + 1;
const int LG = 19;

vector<int> T[DIM];
int dep[DIM], idx[DIM];
int low[LG][2 * DIM], z;
int lg[2 * DIM];

void dfs( int u, int p = 0 ) {
  dep[u] = dep[p] + 1;
  low[0][++z] = u;
  idx[u] = z;
  for ( auto v : T[u] ) {
	if ( v != p ) {
	  dfs(v, u);
	  low[0][++z] = u;
	}	
  }
}

int lca( int u, int v ) {
  if ( idx[u] > idx[v] ) swap(u, v);
  int k = lg[idx[v] - idx[u] + 1];
  int a = low[k][idx[u]];
  int b = low[k][idx[v] - (1 << k) + 1];
  return (dep[a] < dep[b] ? a : b);
}

int main() {
  ios_base::sync_with_stdio(0);
  fin.tie(0);
  int n, q, u, v;

  fin >> n >> q;
  for ( int i = 1; i < n; ++i ) {
	fin >> u;
	T[i + 1].push_back(u);
	T[u].push_back(i + 1);
  }
  dfs(1);
  for ( int l = 1; l < LG; ++l ) {
	for ( int i = 1; i + (1 << (l - 1)) <= z; ++i ) {
      low[l][i] = (dep[low[l - 1][i]] < dep[low[l - 1][i + (1 << (l - 1))]] ? low[l - 1][i] : low[l - 1][i + (1 << (l - 1))]);
	}
  }
  for ( int i = 2; i <= 2 * n; ++i ) {
	lg[i] = lg[i >> 1] + 1;
  }
  while ( q-- ) {
	fin >> u >> v;
	fout << lca(u, v) << "\n";
  }
  fin.close();
  fout.close();
  return 0;
}