Problem p02373 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;

template <typename T> class SparseTable {
  int n;
  vector<vector<T>> t;
  T merge(const T &l, const T &r) { return min(l, r); }

public:
  SparseTable(const vector<T> &b) {
    n = b.size();
    t.push_back(b);
    for (int i = 2, j = 1; i <= n; i <<= 1, j++) {
      t.push_back(vector<T>());
      for (int k = 0; k + i <= n; k++) {
        t[j].push_back(merge(t[j - 1][k], t[j - 1][k + i / 2]));
      }
    }
  }
  T find(int l, int r) {
    r++;
    assert(0 <= l && l < r && r < n);
    unsigned int w = r - l;
    int i = 31 - __builtin_clz(w);
    return merge(t[i][l], t[i][r - (1 << i)]);
  }
  T operator[](int id) { return t[0][id]; }
};

class LCA {
  int V, rt;
  vector<vector<int>> G;
  vector<int> depth, used, id;
  vector<int> vs, de;
  SparseTable<pii> st;
  void dfs(int s, int d) {
    used[s] = 1;
    vs.push_back(s);
    de.push_back(d);
    for (int v : G[s]) {
      if (!used[v]) {
        dfs(v, d + 1);
        vs.push_back(s);
        de.push_back(d);
      }
    }
  }
  vector<pii> init() {
    dfs(rt, 0);
    for (int i = 0; i < (int)vs.size(); i++) {
      if (id[vs[i]] == -1)
        id[vs[i]] = i;
    }
    vector<pii> r((int)vs.size());
    for (int i = 0; i < (int)vs.size(); i++) {
      r[i] = pii(de[i], vs[i]);
    }
    return r;
  }

public:
  LCA(vector<vector<int>> G_, int rt_ = 0)
      : V(G_.size()), rt(rt_), G(G_), depth(V), used(V), id(V, -1), st(init()) {
    for (int i = 0; i < V; i++)
      depth[i] = st[id[i]].first;
  }
  int calc(int a, int b) {
    return st.find(min(id[a], id[b]), max(id[a], id[b])).second;
  }
  int dist(int a, int b) { return depth[a] + depth[b] - depth[calc(a, b)] * 2; }
};

int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int n, q;
  cin >> n;
  vector<vector<int>> G(n);
  for (int i = 0, k; i < n; i++) {
    cin >> k;
    for (int j = 0, c; j < k; j++) {
      cin >> c;
      if (c > i) {
        G[i].push_back(c);
        G[c].push_back(i);
      }
    }
  }
  LCA lca(G);
  cin >> q;
  for (int i = 0, u, v; i < q; i++) {
    cin >> u >> v;
    printf("%d\n", lca.calc(u, v));
  }
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;

template <typename T> class SparseTable {
  int n;
  vector<vector<T>> t;
  T merge(const T &l, const T &r) { return min(l, r); }

public:
  SparseTable(const vector<T> &b) {
    n = b.size();
    t.push_back(b);
    for (int i = 2, j = 1; i <= n; i <<= 1, j++) {
      t.push_back(vector<T>());
      for (int k = 0; k + i <= n; k++) {
        t[j].push_back(merge(t[j - 1][k], t[j - 1][k + i / 2]));
      }
    }
  }
  T find(int l, int r) {
    r++;
    assert(0 <= l && l < r && r <= n);
    unsigned int w = r - l;
    int i = 31 - __builtin_clz(w);
    return merge(t[i][l], t[i][r - (1 << i)]);
  }
  T operator[](int id) { return t[0][id]; }
};

class LCA {
  int V, rt;
  vector<vector<int>> G;
  vector<int> depth, used, id;
  vector<int> vs, de;
  SparseTable<pii> st;
  void dfs(int s, int d) {
    used[s] = 1;
    vs.push_back(s);
    de.push_back(d);
    for (int v : G[s]) {
      if (!used[v]) {
        dfs(v, d + 1);
        vs.push_back(s);
        de.push_back(d);
      }
    }
  }
  vector<pii> init() {
    dfs(rt, 0);
    for (int i = 0; i < (int)vs.size(); i++) {
      if (id[vs[i]] == -1)
        id[vs[i]] = i;
    }
    vector<pii> r((int)vs.size());
    for (int i = 0; i < (int)vs.size(); i++) {
      r[i] = pii(de[i], vs[i]);
    }
    return r;
  }

public:
  LCA(vector<vector<int>> G_, int rt_ = 0)
      : V(G_.size()), rt(rt_), G(G_), depth(V), used(V), id(V, -1), st(init()) {
    for (int i = 0; i < V; i++)
      depth[i] = st[id[i]].first;
  }
  int calc(int a, int b) {
    return st.find(min(id[a], id[b]), max(id[a], id[b])).second;
  }
  int dist(int a, int b) { return depth[a] + depth[b] - depth[calc(a, b)] * 2; }
};

int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int n, q;
  cin >> n;
  vector<vector<int>> G(n);
  for (int i = 0, k; i < n; i++) {
    cin >> k;
    for (int j = 0, c; j < k; j++) {
      cin >> c;
      if (c > i) {
        G[i].push_back(c);
        G[c].push_back(i);
      }
    }
  }
  LCA lca(G);
  cin >> q;
  for (int i = 0, u, v; i < q; i++) {
    cin >> u >> v;
    printf("%d\n", lca.calc(u, v));
  }
  return 0;
}