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

#include <bits/stdc++.h>
using namespace std;
#define int long long
int p[100010];
vector<int> G[100010];
int wpath[100010];
int gw[100010];
int dfs_n[100010];
int n_dfs[100010];
int par[100010];

struct Lazseg {
  static const int MAX = 1 << 18;
  int n;
  int dat[2 * MAX - 1], laz[2 * MAX - 1];
  Lazseg() {}
  Lazseg(int n_) { init(n_); }
  void init(int n_) {
    n = 1;
    while (n < n_)
      n *= 2;
    for (int i = 0; i < 2 * n - 1; i++)
      dat[i] = laz[i] = 0;
  }
  inline void eval(int len, int k) {
    if (k * 2 - 1 < n * 2 - 1) {
      laz[k * 2 + 1] += laz[k];
      laz[k * 2 + 2] += laz[k];
    }
    dat[k] += laz[k] * len;
    laz[k] = 0;
  }
  int update(int a, int b, int x, int k, int l, int r) {
    eval(r - l, k);
    if (r <= a || b <= l)
      return dat[k] + laz[k] * (r - l);
    if (a <= l && r <= b)
      return dat[k] + (laz[k] += x) * (r - l);
    eval(r - l, k);
    return dat[k] = update(a, b, x, k * 2 + 1, l, (l + r) / 2) +
                    update(a, b, x, k * 2 + 2, (l + r) / 2, r);
  }
  int query(int a, int b, int k, int l, int r) {
    eval(r - l, k);
    if (r <= a || b <= l)
      return 0;
    if (a <= l && r <= b)
      return dat[k];
    int vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
    int vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
    return vl + vr;
  }
};

int rec_w(int k) {
  int sum = 1;
  int maw = 0;
  int man;
  for (int i = 0; i < G[k].size(); i++) {
    int w = rec_w(G[k][i]);
    if (maw < w)
      maw = w, man = G[k][i];
    sum += w;
  }
  if (sum == 1)
    return sum;
  wpath[man] = 1;
  gw[k] = man;
  return sum;
}

int used[100010];
void nab(int k) {
  if (used[k])
    return;
  used[k] = 1;
  static int s = 0;
  n_dfs[k] = s;
  dfs_n[s++] = k;
  if (wpath[k]) {
    par[n_dfs[k]] = par[n_dfs[p[k]]];
  }
  nab(gw[k]);
  for (int i = 0; i < G[k].size(); i++) {
    if (G[k][i] == gw[k])
      continue;
    nab(G[k][i]);
  }
}
Lazseg ls(100010);
signed main() {
  p[0] = -1;
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    par[i] = i;
    int k;
    cin >> k;
    for (int j = 0; j < k; j++) {
      int c;
      cin >> c;
      G[i].push_back(c);
      p[c] = i;
    }
  }
  rec_w(0);
  nab(0);
  int q;
  cin >> q;
  for (int i = 0; i < q; i++) {
    int a;
    cin >> a;
    if (a) {
      int u;
      cin >> u;
      u = n_dfs[u];
      int sum = 0;
      while (u > 0) {
        sum += ls.query(par[u] - 1, u, 0, 0, ls.n);
        u = n_dfs[p[dfs_n[par[u]]]];
      }
      cout << sum << endl;
    } else {
      int v, w;
      cin >> v >> w;
      v = n_dfs[v];
      while (v > 0) {
        ls.update(par[v] - 1, v, w, 0, 0, ls.n);
        v = n_dfs[p[dfs_n[par[v]]]];
      }
    }
  }
  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int p[100010];
vector<int> G[100010];
int wpath[100010];
int gw[100010];
int dfs_n[100010];
int n_dfs[100010];
int par[100010];

struct Lazseg {
  static const int MAX = 1 << 9;
  int n;
  int dat[2 * MAX - 1], laz[2 * MAX - 1];
  Lazseg() {}
  Lazseg(int n_) { init(n_); }
  void init(int n_) {
    n = 1;
    while (n < n_)
      n *= 2;
    for (int i = 0; i < 2 * n - 1; i++)
      dat[i] = laz[i] = 0;
  }
  inline void eval(int len, int k) {
    if (k * 2 - 1 < n * 2 - 1) {
      laz[k * 2 + 1] += laz[k];
      laz[k * 2 + 2] += laz[k];
    }
    dat[k] += laz[k] * len;
    laz[k] = 0;
  }
  int update(int a, int b, int x, int k, int l, int r) {
    eval(r - l, k);
    if (r <= a || b <= l)
      return dat[k] + laz[k] * (r - l);
    if (a <= l && r <= b)
      return dat[k] + (laz[k] += x) * (r - l);
    eval(r - l, k);
    return dat[k] = update(a, b, x, k * 2 + 1, l, (l + r) / 2) +
                    update(a, b, x, k * 2 + 2, (l + r) / 2, r);
  }
  int query(int a, int b, int k, int l, int r) {
    eval(r - l, k);
    if (r <= a || b <= l)
      return 0;
    if (a <= l && r <= b)
      return dat[k];
    int vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
    int vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
    return vl + vr;
  }
};

int rec_w(int k) {
  int sum = 1;
  int maw = 0;
  int man;
  for (int i = 0; i < G[k].size(); i++) {
    int w = rec_w(G[k][i]);
    if (maw < w)
      maw = w, man = G[k][i];
    sum += w;
  }
  if (sum == 1)
    return sum;
  wpath[man] = 1;
  gw[k] = man;
  return sum;
}

int used[100010];
void nab(int k) {
  if (used[k])
    return;
  used[k] = 1;
  static int s = 0;
  n_dfs[k] = s;
  dfs_n[s++] = k;
  if (wpath[k]) {
    par[n_dfs[k]] = par[n_dfs[p[k]]];
  }
  nab(gw[k]);
  for (int i = 0; i < G[k].size(); i++) {
    if (G[k][i] == gw[k])
      continue;
    nab(G[k][i]);
  }
}

signed main() {
  p[0] = -1;
  int n;
  cin >> n;
  Lazseg ls(n + 1);
  for (int i = 0; i < n; i++) {
    par[i] = i;
    int k;
    cin >> k;
    for (int j = 0; j < k; j++) {
      int c;
      cin >> c;
      G[i].push_back(c);
      p[c] = i;
    }
  }
  rec_w(0);
  nab(0);
  int q;
  cin >> q;
  for (int i = 0; i < q; i++) {
    int a;
    cin >> a;
    if (a) {
      int u;
      cin >> u;
      u = n_dfs[u];
      int sum = 0;
      while (u > 0) {
        sum += ls.query(par[u] - 1, u, 0, 0, ls.n);
        u = n_dfs[p[dfs_n[par[u]]]];
      }
      cout << sum << endl;
    } else {
      int v, w;
      cin >> v >> w;
      v = n_dfs[v];
      while (v > 0) {
        ls.update(par[v] - 1, v, w, 0, 0, ls.n);
        v = n_dfs[p[dfs_n[par[v]]]];
      }
    }
  }
  return 0;
}