Cod sursa(job #2842240)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 31 ianuarie 2022 13:55:44
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <vector>

using namespace std;

const int N = 1e5 + 5;
const int LOG = 17;

vector<int> fii[N];
int niv[N], up[LOG][N];

void dfs(int nod) {
  for (auto f: fii[nod])
    if (niv[f] == 0) {
      niv[f] = niv[nod] + 1;
      up[0][f] = nod;
      for (int i = 1; i < LOG; ++i)
        up[i][f] = up[i - 1][up[i - 1][f]];
      dfs(f);
    }
}

int lca(int a, int b) {
  if (niv[a] > niv[b])
    swap(a, b);
  int diff = niv[b] - niv[a];
  for (int i = 0; i < LOG; ++i)
    if (diff & (1 << i))
      b = up[i][b];
  if (a == b)
    return a;
  for (int i = LOG - 1; i >= 0; --i)
    if (up[i][a] != up[i][b]) {
      a = up[i][a];
      b = up[i][b];
    }
  return up[0][a];
}

int main() {
  ifstream cin("lca.in");
  ofstream cout("lca.out");
  int n, q;
  cin >> n >> q;
  for (int i = 2; i <= n; ++i) {
    int tata;
    cin >> tata;
    fii[tata].push_back(i);
  }
  niv[1] = 1;
  dfs(1);
  while (q--) {
    int a, b;
    cin >> a >> b;
    cout << lca(a, b) << "\n";
  }
  cin.close();
  cout.close();
  return 0;
}