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

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define all(v) (v).begin(), (v).end()
#define reps(i, m, n) for (int i = (int)(m); i < (int)(n); i++)
#define rep(i, n) reps(i, 0, n)

template <class T1, class T2> void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <class T1, class T2> void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}

typedef pair<int, int> Pi;
typedef tuple<int, int, int> Ti;
typedef vector<int> vint;

const int inf = 1LL << 55;
const int mod = 1e9 + 7;

string str;
int idx;

int expr();
int term();
int number();

int number() {
  string res = "";
  while (idx < (int)str.size() && isdigit(str[idx]))
    res += str[idx++];
  reverse(all(res));
  return stoll(res);
}

int term() {
  if (isdigit(str[idx]))
    return number();
  if (str[idx] == '>') {
    idx++;
    int x = expr();
    assert(str[idx++] == '<');
    assert(str[idx++] == 'S');
    return x * x % mod;
  } else {
    assert(false);
    return 0;
  }
}

int expr() {
  int y = term();
  if (idx >= (int)str.size())
    return y;
  if (str[idx] == '<')
    return y;
  else if (str[idx] == '>') {
    idx++;
    assert(str[idx++] == '>');
    int x = expr();
    return y > 30 ? 0 : x >> y;
  } else {
    assert(false);
    return 0;
  }
}

signed main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  string buf;
  while (getline(cin, buf), buf != "#") {
    str = "";
    rep(i, buf.size()) if (buf[i] != ' ') str += buf[i];
    reverse(all(str));
    idx = 0;
    cout << expr() << endl;
  }

  return 0;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define all(v) (v).begin(), (v).end()
#define reps(i, m, n) for (int i = (int)(m); i < (int)(n); i++)
#define rep(i, n) reps(i, 0, n)

template <class T1, class T2> void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <class T1, class T2> void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}

typedef pair<int, int> Pi;
typedef tuple<int, int, int> Ti;
typedef vector<int> vint;

const int inf = 1LL << 55;
const int mod = 1e9 + 7;

string str;
int idx;

int expr();
int term();
int number();

int number() {
  string res = "";
  while (idx < (int)str.size() && isdigit(str[idx]))
    res += str[idx++];
  reverse(all(res));
  return stoll(res);
}

int term() {
  if (isdigit(str[idx]))
    return number();
  if (str[idx] == '>') {
    idx++;
    int x = expr();
    assert(str[idx++] == '<');
    assert(str[idx++] == 'S');
    return x * x % mod;
  } else {
    assert(false);
    return 0;
  }
}

int expr() {
  int x = term();
  if (idx >= (int)str.size())
    return x;
  if (str[idx] == '<')
    return x;
  else if (str[idx] == '>') {
    idx++;
    assert(str[idx] == '>');
    idx++;
    return x > 30 ? 0 : expr() >> x;
  } else {
    assert(false);
    return 0;
  }
}

signed main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  string buf;
  while (getline(cin, buf), buf != "#") {
    str = "";
    rep(i, buf.size()) if (buf[i] != ' ') str += buf[i];
    reverse(all(str));
    idx = 0;
    cout << expr() << endl;
  }

  return 0;
}