Problem p02374 (C++)

Buggy submission (status: Runtime Error):
#include <cmath>
#include <cstdio>
#include <vector>
using namespace std;

void dfs(vector<vector<int>> &childLists, vector<vector<int>> &edgeIds,
         vector<int> &weights, const int &v) {
  for (int i = 0; i < childLists[v].size(); i++) {
    int u = childLists[v][i];
    weights.push_back(0);
    edgeIds[u].push_back(weights.size() - 1);
    dfs(childLists, edgeIds, weights, u);
    weights.push_back(0);
    edgeIds[u].push_back(weights.size() - 1);
  }
}

void add(vector<int> &tree, const int &n, const int &k, const int &w) {
  int i = k + n - 1;
  while (i > 0) {
    tree[i] += w;
    i = (i - 1) / 2;
  }
  tree[i] += w;
}

int getSumUtil(vector<int> &tree, const int &L, const int &R, const int &i,
               const int &l, const int &r) {
  if (i >= tree.size() || l > r) {
    return 0;
  }
  if (r < L || l > R) {
    return 0;
  }
  if (l >= L && r <= R) {
    return tree[i];
  }
  int m = l + (r - l) / 2;
  return getSumUtil(tree, L, R, 2 * i + 1, l, m) +
         getSumUtil(tree, L, R, 2 * i + 2, m + 1, r);
}

int getSum(vector<int> &tree, const int &n, const int &L, const int &R) {
  return getSumUtil(tree, L, R, 0, 0, n - 1);
}

int main() {
  int n, q, k, x, v, w;
  scanf("%d", &n);
  vector<vector<int>> childLists(n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &k);
    for (int j = 0; j < k; j++) {
      scanf("%d", &x);
      childLists[i].push_back(x);
    }
  }
  vector<int> weights;
  vector<vector<int>> edgeIds(n);
  dfs(childLists, edgeIds, weights, 0);
  int h = ceil(log2(weights.size())) + 1;
  int max_size = pow(2, h) - 1;
  vector<int> tree(max_size, 0);
  scanf("%d", &q);
  for (int i = 0; i < q; i++) {
    scanf("%d", &x);
    if (x == 0) {
      scanf("%d %d", &v, &w);
      add(tree, pow(2, h - 1), edgeIds[v][0], w);
      add(tree, pow(2, h - 1), edgeIds[v][1], -w);
    } else if (x == 1) {
      scanf("%d", &v);
      printf("%d\n", getSum(tree, pow(2, h - 1), 0, edgeIds[v][0]));
    } else
      printf("invalid query %d\n", x);
  }
}


Fixed submission:
#include <cmath>
#include <cstdio>
#include <vector>
using namespace std;

void dfs(vector<vector<int>> &childLists, vector<vector<int>> &edgeIds,
         vector<int> &weights, const int &v) {
  for (int i = 0; i < childLists[v].size(); i++) {
    int u = childLists[v][i];
    weights.push_back(0);
    edgeIds[u].push_back(weights.size() - 1);
    dfs(childLists, edgeIds, weights, u);
    weights.push_back(0);
    edgeIds[u].push_back(weights.size() - 1);
  }
}

void add(vector<int> &tree, const int &n, const int &k, const int &w) {
  int i = k + n - 1;
  while (i > 0) {
    tree[i] += w;
    i = (i - 1) / 2;
  }
  tree[i] += w;
}

int getSumUtil(vector<int> &tree, const int &L, const int &R, const int &i,
               const int &l, const int &r) {
  if (i >= tree.size() || l > r) {
    return 0;
  }
  if (r < L || l > R) {
    return 0;
  }
  if (l >= L && r <= R) {
    return tree[i];
  }
  int m = l + (r - l) / 2;
  return getSumUtil(tree, L, R, 2 * i + 1, l, m) +
         getSumUtil(tree, L, R, 2 * i + 2, m + 1, r);
}

int getSum(vector<int> &tree, const int &n, const int &L, const int &R) {
  return getSumUtil(tree, L, R, 0, 0, n - 1);
}

int main() {
  int n, q, k, x, v, w;
  scanf("%d", &n);
  vector<vector<int>> childLists(n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &k);
    for (int j = 0; j < k; j++) {
      scanf("%d", &x);
      childLists[i].push_back(x);
    }
  }
  vector<int> weights;
  vector<vector<int>> edgeIds(n);
  dfs(childLists, edgeIds, weights, 0);
  int h = ceil(log2(weights.size())) + 1;
  int max_size = pow(2, h) - 1;
  vector<int> tree(max_size, 0);
  scanf("%d", &q);
  for (int i = 0; i < q; i++) {
    scanf("%d", &x);
    if (x == 0) {
      scanf("%d %d", &v, &w);
      add(tree, pow(2, h - 1), edgeIds[v][0], w);
      add(tree, pow(2, h - 1), edgeIds[v][1], -w);
    } else if (x == 1) {
      scanf("%d", &v);
      printf("%d\n",
             v == 0 ? 0 : getSum(tree, pow(2, h - 1), 0, edgeIds[v][0]));
    } else
      printf("invalid query %d\n", x);
  }
}