Cod sursa(job #3030466)

Utilizator dorufDoru Floare doruf Data 17 martie 2023 18:04:28
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;

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

const int N = 2e5 + 5;
int tour[2 * N], pos[N], dep[N];
int lg[2 * N], rmq[25][2 * N];
int n, q, m;
vector<int> g[N];

void dfe(int u, int p) {
  tour[++m] = u;
  pos[u] = m;
  dep[u] = dep[p] + 1;
  for (auto v : g[u])
    if (v != p) {
      dfe(v, u);
      tour[++m] = u;
    }
}
int mindep(int u, int v) {
  return (dep[u] < dep[v] ? u : v);
}
void build() {
  for (int i = 2; i <= m; ++i)
    lg[i] = lg[i / 2] + 1;
  for (int i = 1; i <= m; ++i)
    rmq[0][i] = tour[i];
  for (int p = 1; p <= lg[m] + 1; ++p)
    for (int i = 1; i + (1 << (p-1)) <= m; ++i)
      rmq[p][i] = mindep(rmq[p - 1][i], rmq[p - 1][i + (1 << (p-1))]);
}
int range(int l, int r) {
  if (l > r) swap(l, r);
  int k = lg[r - l + 1];
  return mindep(rmq[k][l], rmq[k][r - (1 << k) + 1]);
}
int lca(int u, int v) {
  if (pos[u] > pos[v])
    swap(u, v);
  return range(pos[u], pos[v]);
}

int main() {
  fin >> n >> q;
  for (int i = 2; i <= n; ++i) {
    int p; fin >> p;
    g[p].emplace_back(i);
    g[i].emplace_back(p);
  }
  dfe(1, 0);
  build();
  while (q--) {
    int u, v;
    fin >> u >> v;
    fout << lca(u,v) << '\n';
  }
}