Problem p00443 (C++)

Buggy submission (status: Runtime Error):
#define _CRT_SECURE_NO_WARNINGS
#include "bits/stdc++.h"
using namespace std;

#define int long long

#define CHOOSE(a) CHOOSE2 a
#define CHOOSE2(a0, a1, a2, a3, x, ...) x
#define REP1(i, s, cond, cal) for (signed i = signed(s); i cond; i cal)
#define REP2(i, s, n) REP1(i, s, < signed(n), ++)
#define REP3(i, n) REP2(i, 0, n)
#define rep(...) CHOOSE((__VA_ARGS__, REP1, REP2, REP3))(__VA_ARGS__)
#define rrep(i, s) rep(i, s, >= 0, --)

#define all(c) begin(c), end(c)
template <typename T> bool maxup(T &a, const T &&b) {
  if (a < b) {
    a = b;
    return true;
  };
}
template <typename T> bool maxup(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  };
}
template <typename T> bool minup(T &a, const T &&b) {
  if (a > b) {
    a = b;
    return true;
  };
}
template <typename T> bool minup(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  };
}

#define X first
#define Y second

using VV = vector<vector<int>>;
using V = vector<int>;
using P = pair<int, int>;
using IP = pair<int, P>;

template <typename T> inline void input(vector<T> &v) {
  for (auto &x : v)
    cin >> x;
}

VV g;
vector<P> len;

int dfs(int now) {
  int a = g[now][0] >= 0 ? dfs(g[now][0]) : 1;
  int b = g[now][1] >= 0 ? dfs(g[now][1]) : 1;
  int p, q;
  tie(p, q) = len[now];
  int gcd = __gcd(a * p, b * q);
  int x = b * q / gcd;
  int y = a * p / gcd;
  return a * x + b * y;
}

signed main() {
  int n;
  while (cin >> n && n) {
    g.clear();
    g.resize(n);
    len.clear();
    len.resize(n);
    V root(n, true);
    rep(i, n) {
      int p, q, r, b;
      cin >> p >> q >> r >> b;
      r--;
      b--;
      int gcd = __gcd(p, q);
      p = p / gcd;
      q = q / gcd;
      if (~r)
        root[r] = false;
      if (~b)
        root[b] = false;
      g[i].push_back(r);
      g[i].push_back(b);
      len[i] = P(p, q);
    }
    int idx = find(all(root), true) - root.begin();
    cout << dfs(idx) << endl;
  }

  system("pause");
}

Fixed submission:
#define _CRT_SECURE_NO_WARNINGS
#include "bits/stdc++.h"
using namespace std;

#define int long long

#define CHOOSE(a) CHOOSE2 a
#define CHOOSE2(a0, a1, a2, a3, x, ...) x
#define REP1(i, s, cond, cal) for (signed i = signed(s); i cond; i cal)
#define REP2(i, s, n) REP1(i, s, < signed(n), ++)
#define REP3(i, n) REP2(i, 0, n)
#define rep(...) CHOOSE((__VA_ARGS__, REP1, REP2, REP3))(__VA_ARGS__)
#define rrep(i, s) rep(i, s, >= 0, --)

#define all(c) begin(c), end(c)
template <typename T> bool maxup(T &a, const T &&b) {
  if (a < b) {
    a = b;
    return true;
  };
}
template <typename T> bool maxup(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  };
}
template <typename T> bool minup(T &a, const T &&b) {
  if (a > b) {
    a = b;
    return true;
  };
}
template <typename T> bool minup(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  };
}

#define X first
#define Y second

using VV = vector<vector<int>>;
using V = vector<int>;
using P = pair<int, int>;
using IP = pair<int, P>;

template <typename T> inline void input(vector<T> &v) {
  for (auto &x : v)
    cin >> x;
}

VV g;
vector<P> len;

int dfs(int now) {
  int a = g[now][0] >= 0 ? dfs(g[now][0]) : 1;
  int b = g[now][1] >= 0 ? dfs(g[now][1]) : 1;
  int p, q;
  tie(p, q) = len[now];
  int gcd = __gcd(a * p, b * q);
  int x = b * q / gcd;
  int y = a * p / gcd;
  return a * x + b * y;
}

signed main() {
  int n;
  while (cin >> n && n) {
    g.clear();
    g.resize(n);
    len.clear();
    len.resize(n);
    V root(n, true);
    rep(i, n) {
      int p, q, r, b;
      cin >> p >> q >> r >> b;
      r--;
      b--;
      int gcd = __gcd(p, q);
      p = p / gcd;
      q = q / gcd;
      if (~r)
        root[r] = false;
      if (~b)
        root[b] = false;
      g[i].push_back(r);
      g[i].push_back(b);
      len[i] = P(p, q);
    }
    int idx = find(all(root), true) - root.begin();
    cout << dfs(idx) << endl;
  }

  // system("pause");
}