Cod sursa(job #2286793)

Utilizator lucametehauDart Monkey lucametehau Data 20 noiembrie 2018 19:34:44
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, q, m, x, y;

int depth[100005], p[100005], v[500005], log1[500005];
int rmq[500005][20];
vector <int> g[100005];

void dfs(int nod, int cnt) {
  depth[nod] = cnt;
  v[++m] = nod;
  for(auto i : g[nod]) {
    dfs(i, cnt + 1);
    v[++m] = nod;
  }
}

int findmin(int l, int r) {
  int d = r - l + 1, lg = log1[d];
  return min(rmq[l][lg], rmq[r - (1 << lg) + 1][lg]);
}

int main() {
  in >> n >> q;
  for(int i = 1; i < n; i++) {
    in >> x;
    g[x].push_back(i + 1);
  }
  dfs(1, 1);
  for(int i = 1; i <= m; i++) {
    if(!p[v[i]])
      p[v[i]] = i;
  }
  for(int i = 2; i <= m; i++) {
    log1[i] = log1[i / 2] + 1;
    rmq[i][0] = v[i];
  }
  for(int j = 1; (1 << j) <= m; j++) {
    for(int i = 1; i <= m - (1 << j) + 1; i++)
      rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
  }
  for(; q; q--) {
    in >> x >> y;
    x = p[x]; y = p[y];
    if(x > y)
      swap(x, y);
    out << findmin(x, y) << "\n";
  }
  return 0;
}