#include #include #include int program[101000]; long long stack[2000]; int sp = 0; int readProgram() { for (int i = 0; true; i++) { char readBuf[50]; fgets(readBuf, 50, stdin); readBuf[strlen(readBuf) - 1] = '\0'; if (strcmp("POP", readBuf) == 0) { program[i] = -1; } else if (strcmp("INV", readBuf) == 0) { program[i] = -2; } else if (strcmp("DUP", readBuf) == 0) { program[i] = -3; } else if (strcmp("SWP", readBuf) == 0) { program[i] = -4; } else if (strcmp("ADD", readBuf) == 0) { program[i] = -5; } else if (strcmp("SUB", readBuf) == 0) { program[i] = -6; } else if (strcmp("MUL", readBuf) == 0) { program[i] = -7; } else if (strcmp("DIV", readBuf) == 0) { program[i] = -8; } else if (strcmp("MOD", readBuf) == 0) { program[i] = -9; } else if (strcmp("END", readBuf) == 0) { program[i] = -10; break; } else if (strcmp("QUIT", readBuf) == 0) { return -1; } else { sscanf(readBuf + 3, "%d", &program[i]); } } return 0; } #define ERR_RET 2000000000 #define ERR_RET_ALWAYS 2000000001 #define IS_INVALID(X) (X < -1000000000 || X > 1000000000) int execute(int param) { sp = 1; stack[0] = param; int tmp = 0; bool negative = false; for (int i = 0; program[i] != -10; i++) { switch (program[i]) { case -1: //POP sp--; if (sp < 0) return ERR_RET; break; case -2: //INV if (sp <= 0) return ERR_RET; stack[sp-1] = -stack[sp-1]; break; case -3: //DUP if (sp <= 0) return ERR_RET; stack[sp] = stack[sp - 1]; sp++; break; case -4: //SWP if (sp <= 1) return ERR_RET; tmp = stack[sp-1]; stack[sp-1] = stack[sp-2]; stack[sp-2] = tmp; break; case -5: // ADD if (sp <= 1) return ERR_RET; stack[sp-2] += stack[sp-1]; sp--; if (IS_INVALID(stack[sp - 1])) return ERR_RET; break; case -6: // SUB if (sp <= 1) return ERR_RET; stack[sp - 2] = stack[sp - 2] - stack[sp - 1]; sp--; if (IS_INVALID(stack[sp - 1])) return ERR_RET; break; case -7: // MUL if (sp <= 1) return ERR_RET; stack[sp - 2] = stack[sp -2] * stack[sp -1]; sp--; if (IS_INVALID(stack[sp - 1])) return ERR_RET; break; case -8: // DIV if (sp <= 1) return ERR_RET; if (stack[sp - 1] == 0) return ERR_RET; stack[sp - 2] = stack[sp - 2] / stack[sp - 1]; sp--; break; case -9: // MOD if (sp <= 1) return ERR_RET; if (stack[sp - 1] == 0) return ERR_RET; negative = stack[sp - 2] < 0; stack[sp - 2] = abs(stack[sp - 2]) % abs(stack[sp -1]); sp--; stack[sp - 1] = negative ? -stack[sp - 1] : stack[sp - 1]; break; default: stack[sp++] = program[i]; break; } } if (sp != 1) return ERR_RET_ALWAYS; return stack[0]; } int main() { bool beg = true; while (readProgram() == 0) { if (!beg) { printf("\n"); } beg= false; int n = 0, par = 0; bool isfail = false; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d ", &par); if (isfail) printf("ERROR\n"); else { int rv = execute(par); if (rv == ERR_RET_ALWAYS) isfail = true; if (rv >= ERR_RET) printf("ERROR\n"); else printf("%d\n", rv); } } } }