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

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int eval(const string &s, int &pos) {
  if (s[pos] == '0') {
    ++pos;
    return 0;
  }
  if (s[pos] == '1') {
    ++pos;
    return 1;
  }
  if (s[pos] == '2') {
    ++pos;
    return 2;
  }
  if (s[pos] == '-') {
    ++pos;
    int v = eval(s, pos);
    return 2 - v;
  }
  if (s[pos] == '(') {
    ++pos;
    int a = eval(s, pos);
    // evalの値には計算済みの値が帰ってくるはずだ
    char c = s[pos++];
    int b = eval(s, pos);
    ++pos;
    if (c == '*') {
      return (a * b + 1) / 2;
    }
    if (c == '+') {
      return max(a, b);
    }
  }
  return 2;
}

int main(void) {
  while (true) {
    string s, temp;
    cin >> s;
    if (s == ".")
      break;
    string p, q, r;
    int count = 0;
    int pos;

    for (int j = 0; j < 3; j++) {
      if (j == 0)
        p = '0';
      if (j == 1)
        p = '1';
      if (j == 2)
        p = '2';
      for (int k = 0; k < 3; k++) {
        if (k == 0)
          q = '0';
        if (k == 1)
          q = '1';
        if (k == 2)
          q = '2';
        for (int l = 0; l < 3; l++) {
          if (l == 0)
            r = '0';
          if (l == 1)
            r = '1';
          if (l == 2)
            r = '2';
          temp = s;
          pos = 0;
          for (int i = 0; i < s.length(); i++) {
            if (s.at(i) == 'P') {
              temp.replace(i, 1, p);
            }
            if (s.at(i) == 'Q') {
              temp.replace(i, 1, q);
            }
            if (s.at(i) == 'R') {
              temp.replace(i, 1, r);
            }
          }
          if (eval(temp, pos) == 2)
            count++;
        }
      }
    }
    cout << count << endl;
  }
  return 0;
}


Error: -11

Fixed submission:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int eval(const string &s, int &pos) {
  if (s[pos] == '0') {
    ++pos;
    return 0;
  }
  if (s[pos] == '1') {
    ++pos;
    return 1;
  }
  if (s[pos] == '2') {
    ++pos;
    return 2;
  }
  if (s[pos] == '-') {
    ++pos;
    int v = eval(s, pos);
    return 2 - v;
  }
  if (s[pos] == '(') {
    int a = eval(s, pos);
    // evalの値には計算済みの値が帰ってくるはずだ
    char c = s[pos++];
    int b = eval(s, pos);

    if (c == '*') {
      return (a * b + 1) / 2;
    }
    if (c == '+') {
      return max(a, b);
    }
    abort();
  }
  return 2;
}

int main(void) {
  string s, temp;
  cin >> s;
  string p, q, r;
  int count = 0;
  int zero = 0;

  for (int j = 0; j < 3; j++) {
    if (j == 0)
      p = '0';
    if (j == 1)
      p = '1';
    if (j == 2)
      p = '2';
    for (int k = 0; k < 3; k++) {
      if (j == 0)
        q = '0';
      if (j == 1)
        q = '1';
      if (j == 2)
        q = '2';
      for (int l = 0; l < 3; l++) {
        if (j == 0)
          q = '0';
        if (j == 1)
          q = '1';
        if (j == 2)
          q = '2';
        temp = s;
        zero = 0;
        for (int i = 0; i < s.length(); i++) {
          if (s.at(i) == 'P') {
            temp.replace(i, 1, p);
          }
          if (s.at(i) == 'Q') {
            temp.replace(i, 1, q);
          }
          if (s.at(i) == 'R') {
            temp.replace(i, 1, r);
          }
        }
        if (eval(temp, zero) == 2)
          count++;
      }
    }
  }
  cout << count << endl;

  return 0;
}