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

#include <iostream>
#include <stack>
#include <vector>

using namespace std;

int p, q, r;
void invert(stack<int> &st) {
  int x;
  x = st.top();
  st.pop();
  while (!st.empty()) {
    if (st.top() != -1)
      break;
    st.pop();
    x = (x - 1) * (-1) + 1;
    //	cout << st.size();
  }
  st.push(x);
  return;
}

void calc(stack<int> &st) {
  int x, y;
  while (true) {
    invert(st);
    x = st.top();
    st.pop();
    if (st.top() == -4) {
      st.pop();
      st.push(x);
      invert(st);
      break;
    } else {
      int t = st.top();
      st.pop();
      invert(st);
      if (t == -2) {
        y = st.top();
        st.pop();
        st.push(max(x, y));
      } else if (t == -3) {
        y = st.top();
        st.pop();
        st.push(min(x, y));
      }
    }
  }
  return;
}

int main() {
  while (true) {
    string str;
    cin >> str;
    int ans = 0;
    stack<int> st;
    if (str[0] == '.')
      break;
    for (p = 0; p < 3; p++) {
      for (q = 0; q < 3; q++) {
        for (r = 0; r < 3; r++) {
          for (int i = 0; i < str.length(); i++) {
            if (str[i] == '(')
              st.push(-4);
            else if (str[i] == '-')
              st.push(-1);
            else if (str[i] == '+')
              st.push(-2);
            else if (str[i] == '*')
              st.push(-3);
            else if (str[i] == 'P')
              st.push(p);
            else if (str[i] == 'Q')
              st.push(q);
            else if (str[i] == 'R')
              st.push(r);
            else if (str[i] == ')')
              calc(st);
            else
              st.push((int)(str[i] - '0'));
          }
          if (st.size() != 1) {
            invert(st);
          }
          if (st.top() == 2)
            ans++;
        }
      }
    }
    cout << ans << endl;
  }
  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

int p, q, r;

void invert(stack<int> &st) {
  int x;
  x = st.top();
  st.pop();
  if (st.empty()) {
    st.push(x);
    return;
  }
  while (st.top() == -1) {
    x = (x - 1) * (-1) + 1;
    st.pop();
  }
  st.push(x);
  return;
}

void calc(stack<int> &st) {
  int x, y;
  while (true) {
    invert(st);
    x = st.top();
    st.pop();
    int t = st.top();
    if (t == -4) {
      st.pop();
      st.push(x);
      invert(st);
      return;
    } else {
      st.pop();
      invert(st);
      y = st.top();
      st.pop();
      if (t == -2) {
        st.push(max(x, y));
      } else if (t == -3) {
        st.push(min(x, y));
      }
    }
    // cout << st.top() << endl;
  }
}

int main() {
  while (true) {
    string str;
    cin >> str;
    if (str[0] == '.')
      break;
    stack<int> st;
    int ans = 0;
    for (p = 0; p < 3; p++) {
      for (q = 0; q < 3; q++) {
        for (r = 0; r < 3; r++) {
          for (int i = 0; i < str.length(); i++) {
            if (str[i] == '-')
              st.push(-1);
            else if (str[i] == '+')
              st.push(-2);
            else if (str[i] == '*')
              st.push(-3);
            else if (str[i] == '(')
              st.push(-4);
            else if (str[i] == 'P')
              st.push(p);
            else if (str[i] == 'Q')
              st.push(q);
            else if (str[i] == 'R')
              st.push(r);
            else if (str[i] == ')')
              calc(st);
            else
              st.push((int)str[i] - 48);
          }
          // cout << st.top();
          if (st.top() == 2)
            ans++;
        }
      }
    }
    cout << ans << endl;
  }
  return 0;
}