#include #include #include char Buffer[1000]; char Instr[200000][20]; int Stack[2000000]; void GetLine(char* Buffer) { int n = 0; while(1) { Buffer[n] = getchar(); if(Buffer[n] == '\n') { break; } n++; } Buffer[n] = '\0'; } void Unsign(int& a, int& s) { if(a >= 0) { s = 0; } else { a *= -1; s = 1; } } void Sign(int& a, int s) { if(s) { a *= -1; } } int Invalid(long long int a) { return (a < -1000000000) || (a > 1000000000); } int Do(char* Instr, int& nStack) { if(Instr[0] == 'N') { int a; sscanf(Instr + 4, "%d", &a); Stack[nStack++] = a; } else if(Instr[0] == 'P') { if(!(nStack)) { return 0; } nStack--; } else if(Instr[0] == 'I') { if(!(nStack)) { return 0; } Stack[nStack - 1] *= -1; } else if((Instr[0] == 'D') && (Instr[1] == 'U')) { if(!(nStack)) { return 0; } Stack[nStack] = Stack[nStack - 1]; nStack++; } else if((Instr[0] == 'S') && (Instr[1] == 'W')) { if(nStack < 2) { return 0; } int a = Stack[nStack - 1]; Stack[nStack - 1] = Stack[nStack - 2]; Stack[nStack - 2] = a; } else if(Instr[0] == 'A') { if(nStack < 2) { return 0; } long long int a = ((long long int) Stack[nStack - 2]) + Stack[nStack - 1]; if(Invalid(a)) { return 0; } nStack -= 2; Stack[nStack++] = a; } else if((Instr[0] == 'S') && (Instr[1] == 'U')) { if(nStack < 2) { return 0; } long long int a = ((long long int) Stack[nStack - 2]) - Stack[nStack - 1]; if(Invalid(a)) { return 0; } nStack -= 2; Stack[nStack++] = a; } else if((Instr[0] == 'M') && (Instr[1] == 'U')) { if(nStack < 2) { return 0; } long long int a = ((long long int) Stack[nStack - 2]) * Stack[nStack - 1]; if(Invalid(a)) { return 0; } nStack -= 2; Stack[nStack++] = a; } else if((Instr[0] == 'D') && (Instr[1] == 'I')) { if(nStack < 2) { return 0; } if(!(Stack[nStack - 1])) { return 0; } int a1 = Stack[nStack - 2], s1; int a2 = Stack[nStack - 1], s2; Unsign(a1, s1); Unsign(a2, s2); int a = a1 / a2; Sign(a, s1 ^ s2); if(Invalid(a)) { return 0; } nStack -= 2; Stack[nStack++] = a; } else if((Instr[0] == 'M') && (Instr[1] == 'O')) { if(nStack < 2) { return 0; } if(!(Stack[nStack - 1])) { return 0; } int a1 = Stack[nStack - 2], s1; int a2 = Stack[nStack - 1], s2; Unsign(a1, s1); Unsign(a2, s2); int a = a1 % a2; Sign(a, s1); if(Invalid(a)) { return 0; } nStack -= 2; Stack[nStack++] = a; } return 1; } void Run(int a, int nInstr) { int nStack = 0; Stack[nStack++] = a; for(int i = 0; i < nInstr; i++) { if(Instr[i][0] == 'E') { break; } if(!(Do(Instr[i], nStack))) { printf("ERROR\n"); return; } } if(nStack == 1) { printf("%d\n", Stack[0]); } else { printf("ERROR\n"); } } int main() { while(1) { int nInstr = 0; while(1) { GetLine(Buffer); if(Buffer[0] == 'Q') { return 0; } if((Buffer[0] >= '0') && (Buffer[0] <= '9')) { break; } strcpy(Instr[nInstr++], Buffer); } int n; sscanf(Buffer, "%d", &n); for(int i = 0; i < n; i++) { int a; scanf("%d", &a); Run(a, nInstr); } printf("\n"); } }