Cod sursa(job #3235737)

Utilizator Traian_7109Traian Mihai Danciu Traian_7109 Data 20 iunie 2024 21:28:14
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>

using namespace std;

#define MAXN 100000

int par[MAXN + 1], depth[MAXN + 1], jump[MAXN + 1], ptr;

int kthanc(int u, int k) {
  while(depth[u] > k) {
    if(depth[jump[u]] < k) {
      u = par[u];
    } else {
      u = jump[u];
    }
  }
  return u;
}

int lca(int u, int v) {
  if(depth[u] < depth[v]) {
    swap(u, v);
  }
  u = kthanc(u, depth[v]);
  while(u != v) {
    if(jump[u] == jump[v]) {
      u = par[u];
      v = par[v];
    } else {
      u = jump[u];
      v = jump[v];
    }
  }
  return u;
}

int main() {
  ifstream fin("lca.in");
  ofstream fout("lca.out");
  
  jump[1] = 1; // radacina
  
  int n, m;
  fin >> n >> m;
  for(int i = 2; i <= n; i++) {
    int p;
    fin >> p;
    par[i] = p;
    depth[i] = depth[p] + 1;
    if(depth[p] - depth[jump[p]] == depth[jump[p]] - depth[jump[jump[p]]]) {
      jump[i] = jump[jump[p]];
    } else {
      jump[i] = p;
    }
  }
  
  while(m--) {
    int u, v;
    fin >> u >> v;
    fout << lca(u, v) << "\n";
  }
  
  return 0;
}