Problem p01087 (C++)

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

#define fi first
#define se second
#define repl(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
#define repr(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define rep(i, n) repl(i, 0, n)
#define each(itr, v) for (auto itr : v)
#define pb(s) push_back(s)
#define all(x) (x).begin(), (x).end()
#define dbg(x) cout << #x " = " << x << endl
#define print(x) cout << x << endl
#define maxch(x, y) x = max(x, y)
#define minch(x, y) x = min(x, y)
#define uni(x) x.erase(unique(all(x)), x.end())
#define exist(x, y) (find(all(x), y) != x.end())
#define bcnt(x) bitset<32>(x).count()

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
typedef pair<P, int> PPI;
typedef pair<int, P> PIP;
typedef pair<ll, ll> PL;
typedef pair<P, ll> PPL;
typedef set<int> S;

#define INF INT_MAX / 3
#define MAX_N 1000000001

string s[10];

ll calc(int p, int q) {
  bool add = false;
  if ('0' <= s[p][s[p].length() - 1] && s[p][s[p].length() - 1] <= '9') {
    return s[p][s[p].length() - 1] - '0';
  } else if (s[p][s[p].length() - 1] == '+') {
    add = true;
  }

  ll ans = ((add) ? 0 : 1);
  repl(i, p + 1, q) {
    if ('0' <= s[i][s[i].length() - 1] && s[i][s[i].length() - 1] <= '9') {
      if (add)
        ans += (s[i][s[i].length() - 1] - '0');
      else
        ans *= (s[i][s[i].length() - 1] - '0');
    } else {
      int j = i++;
      while (i < q && s[j].length() < s[i].length())
        i++;
      if (add)
        ans += calc(j, i);
      else
        ans *= calc(j, i);
      i--;
    }
  }

  return ans;
}

int main() {
  cin.sync_with_stdio(false);
  int n;

  while (cin >> n, n) {
    rep(i, n) cin >> s[i];
    print(calc(0, n));
  }

  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define repl(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
#define repr(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define rep(i, n) repl(i, 0, n)
#define each(itr, v) for (auto itr : v)
#define pb(s) push_back(s)
#define all(x) (x).begin(), (x).end()
#define dbg(x) cout << #x " = " << x << endl
#define print(x) cout << x << endl
#define maxch(x, y) x = max(x, y)
#define minch(x, y) x = min(x, y)
#define uni(x) x.erase(unique(all(x)), x.end())
#define exist(x, y) (find(all(x), y) != x.end())
#define bcnt(x) bitset<32>(x).count()

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
typedef pair<P, int> PPI;
typedef pair<int, P> PIP;
typedef pair<ll, ll> PL;
typedef pair<P, ll> PPL;
typedef set<int> S;

#define INF INT_MAX / 3
#define MAX_N 1000000001

string s[20];

ll calc(int p, int q) {
  bool add = false;
  if ('0' <= s[p][s[p].length() - 1] && s[p][s[p].length() - 1] <= '9') {
    return s[p][s[p].length() - 1] - '0';
  } else if (s[p][s[p].length() - 1] == '+') {
    add = true;
  }

  ll ans = ((add) ? 0 : 1);
  repl(i, p + 1, q) {
    if ('0' <= s[i][s[i].length() - 1] && s[i][s[i].length() - 1] <= '9') {
      if (add)
        ans += (s[i][s[i].length() - 1] - '0');
      else
        ans *= (s[i][s[i].length() - 1] - '0');
    } else {
      int j = i++;
      while (i < q && s[j].length() < s[i].length())
        i++;
      if (add)
        ans += calc(j, i);
      else
        ans *= calc(j, i);
      i--;
    }
  }

  return ans;
}

int main() {
  cin.sync_with_stdio(false);
  int n;

  while (cin >> n, n) {
    rep(i, n) cin >> s[i];
    print(calc(0, n));
  }

  return 0;
}