#include #include #include #define LINEL 32 #define STACK 2000 #define MAXIN 200000 #define MAXVAL 1000000000 struct instr { char op; int val; }; int stack[STACK]; struct instr prg[MAXIN]; int inputs[MAXIN], ninp, i; int err; int stackptr; int pop() { if (stackptr < 1) { err = 1; return INT_MAX; } return stack[--stackptr]; } int check_val(long long v) { if (v > (long long)MAXVAL || v < -(long long)MAXVAL) err = 1; return v; } void push(int v) { check_val(v); stack[stackptr++] = v; } int check_div(int d) { if (!d) { err = 1; return 1; } return d; } void ex(int input) { int i=0; int r0, r1; stackptr = 1; stack[0] = input; err = 0; while (1) { switch (prg[i].op) { case 'N': push(prg[i].val); break; case 'P': pop(); break; case 'I': push(-pop()); break; case 'D': r0 = pop(); push(r0); push(r0); break; case 'W': r0 = pop(); r1 = pop(); push(r0); push(r1); break; case 'A': push(pop()+pop()); break; case '-': r0 = pop(); r1 = pop(); push(r1-r0); break; case '*': push(check_val((long long)pop()*(long long)pop())); break; case '/': r0 = pop(); r1 = pop(); push(r1/check_div(r0)); break; case '%': r0 = pop(); r1 = pop(); push(r1%check_div(r0)); break; case 0: if (err || stackptr != 1) printf("ERROR\n"); else printf("%d\n", stack[0]); return; } /*printf("OP: %c; SP: %d\n", prg[i].op, stackptr);*/ if (err) { printf("ERROR\n"); return; } i++; } } int main(void) { struct instr *prp = prg; char riadok[LINEL]; while (1) { fgets(riadok, LINEL, stdin); if (riadok[0]=='Q') break; switch (riadok[0]) { case 'N': prp->op = 'N'; (prp++)->val = atoi(riadok + 4); break; case 'P': case 'I': case 'A': (prp++)->op = riadok[0]; break; case 'D': if (riadok[1]=='U') (prp++)->op = 'D'; else (prp++)->op = '/'; break; case 'M': if (riadok[1]=='U') (prp++)->op = '*'; else (prp++)->op = '%'; break; case 'S': if (riadok[1]=='W') (prp++)->op = 'W'; else (prp++)->op = '-'; break; case 'E': (prp++)->op = 0; } if (riadok[0] == 'E') { scanf("%d\n", &ninp); for (i=0; i