Problem p01771 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

#define CIN_ONLY if (1)
struct cww {
  cww() {
    CIN_ONLY {
      ios::sync_with_stdio(false);
      cin.tie(0);
    }
  }
} star;
#define fin "\\n"
#define FOR(i, bg, ed) for (int i = (bg); i < (ed); i++)
#define REP(i, n) FOR(i, 0, n)
#define ALL(v) (v).begin(), (v).end()
#define fi first
#define se second
#define pb push_back
#define DEBUG if (0)
#define REC(ret, ...) std::function<ret(__VA_ARGS__)>
template <typename T> inline bool chmin(T &l, T r) {
  bool a = l > r;
  if (a)
    l = r;
  return a;
}
template <typename T> inline bool chmax(T &l, T r) {
  bool a = l < r;
  if (a)
    l = r;
  return a;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &it : v)
    is >> it;
  return is;
}
typedef vector<int> V;
typedef vector<V> VV;
typedef VV Graph;
typedef pair<int, int> P;

int pp[22][312345];
int s[612345];

void euler_tour(int v, Graph &C, vector<P> &seg, int &cnt) {
  int pt = 0;
  s[pt++] = -1;
  s[pt++] = 1;
  while (pt) {
    int vv = s[--pt];
    int v = abs(vv) - 1;
    if (vv > 0) {
      seg[v].fi = cnt++;
      for (auto &u : C[v])
        if (u != pp[0][v]) {
          s[pt++] = -u - 1;
          s[pt++] = u + 1;
        }
    } else
      seg[v].se = cnt++;
  }
}

// lca?????????
void build_PP(int N) {
  for (int k = 0, f = 1; f; k++) {
    f = 0;
    for (int i = 0; i < N; i++) {
      if (pp[k][i] < 0)
        pp[k + 1][i] = -1;
      else {
        pp[k + 1][i] = pp[k][pp[k][i]];
        f = 1;
      }
    }
  }
}

int lca(int u, int v, V &D) {
  if (D[u] > D[v])
    swap(u, v);
  for (int k = 0, d; (d = D[v] - D[u]); k++)
    if ((d >> k) & 1)
      v = pp[k][v];
  if (u == v)
    return v;
  for (int k = 21; k >= 0; k--) {
    if (pp[k][u] != pp[k][v]) {
      u = pp[k][u];
      v = pp[k][v];
    }
  }
  return pp[0][u];
}

void dfs(int v, Graph &g, V &d) {
  int pt = 0;
  s[pt++] = v;
  while (pt) {
    int v = s[--pt];
    for (auto &u : g[v])
      if (pp[0][v] != u) {
        d[u] = d[v] + 1;
        pp[0][u] = v;
        s[pt++] = u;
      }
  }
}
#define BITTYPE long long
#define BITCNT 2
#define BITSIZE 6123456
namespace _BIT {
int i = 0;
BITTYPE t[2][BITSIZE];
inline BITTYPE *get() { return t[i++]; }
} // namespace _BIT

struct BIT {
  using T = BITTYPE;
  T *t;
  int n;
  BIT(int N) : t(_BIT::get()), n(N + 1) { REP(i, n + 1) t[i] = 0; }
  void add(int r, T v) { // add v for [1,r]
    for (; r; r -= r & -r)
      t[r] += v;
  }
  void add(int l, int r, T v) { // add v for [l,r]
    add(r, v);
    add(l - 1, -v);
  }
  T get(int i) { // get sum[i]
    T res = 0;
    for (; i <= n; i += i & -i)
      res += t[i];
    return res;
  }
};

int main() {
  int N, Q;
  cin >> N >> Q;
  Graph g(N);
  REP(i, N - 1) {
    int a, b;
    cin >> a >> b;
    g[a].pb(b);
    g[b].pb(a);
  }
  V d(N, 0);
  REP(i, 22) REP(j, N) pp[i][j] = -1;
  dfs(0, g, d);
  build_PP(N);
  vector<P> seg(N);
  int M = 1;
  euler_tour(0, g, seg, M);
  BIT latte(M + 10);
  BIT malta(M + 10);
  REP(q, Q) {
    int type, x, y;
    cin >> type >> x >> y;
    if (type == 0) {
      int camy = lca(x, y, d);
      LL A = latte.get(seg[x].fi) * d[x] + malta.get(seg[x].fi);
      LL B = latte.get(seg[y].fi) * d[y] + malta.get(seg[y].fi);
      LL C = latte.get(seg[camy].fi) * d[camy] + malta.get(seg[camy].fi);
      // cout<<A<<" "<<B<<" "<<C<<endl;
      cout << A + B - 2 * C << endl;
    } else {
      LL luz = y;
      LL izr = -y * d[x];
      latte.add(seg[x].fi, seg[x].se, luz);
      malta.add(seg[x].fi, seg[x].se, izr);
    }
  }
  return 0;
}

Error: -11

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

#define CIN_ONLY if (1)
struct cww {
  cww() {
    CIN_ONLY {
      ios::sync_with_stdio(false);
      cin.tie(0);
    }
  }
} star;
#define fin "\\n"
#define FOR(i, bg, ed) for (int i = (bg); i < (ed); i++)
#define REP(i, n) FOR(i, 0, n)
#define ALL(v) (v).begin(), (v).end()
#define fi first
#define se second
#define pb push_back
#define DEBUG if (0)
#define REC(ret, ...) std::function<ret(__VA_ARGS__)>
template <typename T> inline bool chmin(T &l, T r) {
  bool a = l > r;
  if (a)
    l = r;
  return a;
}
template <typename T> inline bool chmax(T &l, T r) {
  bool a = l < r;
  if (a)
    l = r;
  return a;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &it : v)
    is >> it;
  return is;
}
typedef vector<int> V;
typedef vector<V> VV;
typedef VV Graph;
typedef pair<int, int> P;

int pp[22][312345];
void euler_tour(int v, int p, Graph &C, vector<P> &seg, int &cnt) {
  int l = cnt++;
  for (auto &e : C[v])
    if (e != p)
      euler_tour(e, v, C, seg, cnt);
  int r = cnt++;
  seg[v] = P(l, r);
}

// lca?????????
void build_PP(int N) {
  for (int k = 0, f = 1; f; k++) {
    f = 0;
    for (int i = 0; i < N; i++) {
      if (pp[k][i] < 0)
        pp[k + 1][i] = -1;
      else {
        pp[k + 1][i] = pp[k][pp[k][i]];
        f = 1;
      }
    }
  }
}

int lca(int u, int v, V &D) {
  if (D[u] > D[v])
    swap(u, v);
  for (int k = 0, d; (d = D[v] - D[u]); k++)
    if ((d >> k) & 1)
      v = pp[k][v];
  if (u == v)
    return v;
  for (int k = 21; k >= 0; k--) {
    if (pp[k][u] != pp[k][v]) {
      u = pp[k][u];
      v = pp[k][v];
    }
  }
  return pp[0][u];
}

int s[312345];
void dfs(int v, Graph &g, V &d) {
  int pt = 0;
  s[pt++] = v;
  while (pt) {
    int v = s[--pt];
    for (auto &u : g[v])
      if (pp[0][v] != u) {
        d[u] = d[v] + 1;
        pp[0][u] = v;
        s[pt++] = u;
      }
  }
}
#define BITTYPE long long
#define BITCNT 2
#define BITSIZE 6123456
namespace _BIT {
int i = 0;
BITTYPE t[2][BITSIZE];
inline BITTYPE *get() { return t[i++]; }
} // namespace _BIT

struct BIT {
  using T = BITTYPE;
  T *t;
  int n;
  BIT(int N) : t(_BIT::get()), n(N + 1) { REP(i, n + 1) t[i] = 0; }
  void add(int r, T v) { // add v for [1,r]
    for (; r; r -= r & -r)
      t[r] += v;
  }
  void add(int l, int r, T v) { // add v for [l,r]
    add(r, v);
    add(l - 1, -v);
  }
  T get(int i) { // get sum[i]
    T res = 0;
    for (; i <= n; i += i & -i)
      res += t[i];
    return res;
  }
};

int main() {
  int N, Q;
  cin >> N >> Q;
  Graph g(N);
  REP(i, N - 1) {
    int a, b;
    cin >> a >> b;
    g[a].pb(b);
    g[b].pb(a);
  }
  V d(N, 0);
  REP(i, 22) REP(j, N) pp[i][j] = -1;
  dfs(0, g, d);
  build_PP(N);
  vector<P> seg(N);
  int M = 1;
  euler_tour(0, 0, g, seg, M);
  BIT latte(M + 10);
  BIT malta(M + 10);
  REP(q, Q) {
    int type, x, y;
    cin >> type >> x >> y;
    if (type == 0) {
      int camy = lca(x, y, d);
      LL A = latte.get(seg[x].fi) * d[x] + malta.get(seg[x].fi);
      LL B = latte.get(seg[y].fi) * d[y] + malta.get(seg[y].fi);
      LL C = latte.get(seg[camy].fi) * d[camy] + malta.get(seg[camy].fi);
      // cout<<A<<" "<<B<<" "<<C<<endl;
      cout << A + B - 2 * C << endl;
    } else {
      LL luz = y;
      LL izr = -y * d[x];
      latte.add(seg[x].fi, seg[x].se, luz);
      malta.add(seg[x].fi, seg[x].se, izr);
    }
  }
  return 0;
}