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

#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, b) FOR(i, 0, b)
#define F first
#define S second
#define PB push_back
#define BE(c) c.begin(), c.end()
using namespace std;
typedef long long LL;
typedef LL ut;
typedef vector<ut> VI;
typedef pair<ut, ut> pr;
typedef vector<pr> Vpr;
typedef vector<ut, pr> ppr;
typedef priority_queue<pr, Vpr, greater<pr>> PQ;
typedef vector<ppr> Vppr;
const int SIZE = 1 + 6 * 1e+5;
const LL p = 7 + 1e+9;
int N, Q;
VI child[SIZE];
VI nums;
LL sumBIT[SIZE], BIT[SIZE];
LL bs[SIZE], be[SIZE], ne[SIZE], talls[SIZE];
LL master[SIZE][20];
bool Eulered[SIZE];
void Euler() {

  stack<int> stacks;
  stacks.push(0);
  while (!stacks.empty()) {
    int x = stacks.top();
    if (!Eulered[x]) {
      bs[x] = nums.size();
      nums.PB(x);
      REP(i, child[x].size()) {
        stacks.push(child[x][i]);
        talls[child[x][i]] = talls[x] + 1;
      }
      Eulered[x] = true;
    } else {
      ne[x] = nums.size();
      stacks.pop();
    }
  }
}
void add(int x, LL p, LL bit[]) {
  while (x <= SIZE) {
    bit[x] += p;
    x += x & -x;
  }
}
LL sum(int x, LL bit[]) {
  LL ans = 0;
  while (x > 0) {
    ans += bit[x];
    x -= x & -x;
  }
  return ans;
}
LL sum(int a, int b, LL bit[]) { return sum(b, bit) - sum(a - 1, bit); }
LL dist(int x) { return sum(bs[x], sumBIT) * talls[x] + sum(bs[x], BIT); }
int LCA(int a, int b) {
  if (talls[a] < talls[b])
    return LCA(b, a);
  int need = talls[a] - talls[b];
  REP(i, 20)
  if (need & (1 << i))
    a = master[a][i];
  if (a == b)
    return a;
  REP(i, 20) {
    int k = 20 - i - 1;
    if (master[a][k] != master[b][k]) {
      a = master[a][k];
      b = master[b][k];
    }
  }
  return master[a][0];
}
int main() {
  cin >> N >> Q;
  int a, b, c;
  nums.PB(0);
  REP(i, N - 1) {
    scanf("%d%d", &a, &b);
    child[a].PB(b);
    master[b][0] = a;
  }
  Euler();
  FOR(i, 1, 20)
  REP(j, N)
  master[j][i] = master[master[j][i - 1]][i - 1];
  REP(i, Q) {
    scanf("%d%d%d", &a, &b, &c);
    if (a) {
      add(bs[b] + 1, c, sumBIT);
      add(ne[b], -c, sumBIT);
      add(bs[b] + 1, -c * talls[b], BIT);
      add(ne[b], c * talls[b], BIT);
    } else {
      printf("%lld\\n", dist(b) + dist(c) - 2 * dist(LCA(b, c)));
    }
  }
}

Error: -11

Fixed submission:

#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, b) FOR(i, 0, b)
#define F first
#define S second
#define PB push_back
#define BE(c) c.begin(), c.end()
using namespace std;
typedef long long LL;
typedef LL ut;
typedef vector<ut> VI;
typedef pair<ut, ut> pr;
typedef vector<pr> Vpr;
typedef vector<ut, pr> ppr;
typedef priority_queue<pr, Vpr, greater<pr>> PQ;
typedef vector<ppr> Vppr;
const int SIZE = 1 + 6 * 1e+5;
const LL p = 7 + 1e+9;
int N, Q;
VI child[SIZE];
VI nums;
LL sumBIT[SIZE], BIT[SIZE];
LL bs[SIZE], be[SIZE], ne[SIZE], talls[SIZE];
LL master[SIZE][20];
void Euler(int x, LL tall) {
  talls[x] = tall;
  bs[x] = nums.size();
  nums.PB(x);
  REP(i, child[x].size())
  Euler(child[x][i], tall + 1);
  be[x] = nums.size() - 1;
  ne[x] = be[x] + 1;
}
void add(int x, LL p, LL bit[]) {
  while (x <= SIZE) {
    bit[x] += p;
    x += x & -x;
  }
}
LL sum(int x, LL bit[]) {
  LL ans = 0;
  while (x > 0) {
    ans += bit[x];
    x -= x & -x;
  }
  return ans;
}
LL sum(int a, int b, LL bit[]) { return sum(b, bit) - sum(a - 1, bit); }
LL dist(int x) { return sum(bs[x], sumBIT) * talls[x] + sum(bs[x], BIT); }
int LCA(int a, int b) {
  if (talls[a] < talls[b])
    return LCA(b, a);
  int need = talls[a] - talls[b];
  REP(i, 20)
  if (need & (1 << i))
    a = master[a][i];
  if (a == b)
    return a;
  REP(i, 20) {
    int k = 20 - i - 1;
    if (master[a][k] != master[b][k]) {
      a = master[a][k];
      b = master[b][k];
    }
  }
  return master[a][0];
}
int main() {
  cin >> N >> Q;
  int a, b, c;
  nums.PB(0);
  REP(i, N - 1) {
    scanf("%d%d", &a, &b);
    child[a].PB(b);
    master[b][0] = a;
  }
  Euler(0, 0);
  FOR(i, 1, 20)
  REP(j, N)
  master[j][i] = master[master[j][i - 1]][i - 1];
  REP(i, Q) {
    scanf("%d%d%d", &a, &b, &c);
    if (a) {
      add(bs[b] + 1, c, sumBIT);
      add(ne[b], -c, sumBIT);
      add(bs[b] + 1, -c * talls[b], BIT);
      add(ne[b], c * talls[b], BIT);
    } else {
      printf("%lld\\n", dist(b) + dist(c) - 2 * dist(LCA(b, c)));
    }
  }
}