#include #include #include #include #include #include #include #include using namespace std; #define FORC(it, V) for(__typeof((V).begin()) it = (V).begin(); it != (V).end(); ++it) enum C { num, pop, inv, dupp, swp, add, sub, mul, divv, mod }; const int inf = 1000000000; struct cmd { C type; int arg; cmd() {} cmd(C _type, int _arg) : type(_type), arg(_arg) {} }; vector V; typedef long long llint; inline llint myabs(llint x) { if (x < 0) return -x; return x; } inline llint getSign(llint a, llint b) { if (a >= 0 && b >= 0) return +1; if (a < 0 && b < 0) return +1; return -1; } int eval(int x_inp, int& ok) { ok = true; stack S; S.push(x_inp); FORC(it, V) { if (it->type == num) { S.push(it->arg); } else if (it->type == pop) { if (S.size() < 1) { ok = false; return -1; } S.pop(); } else if (it->type == inv) { if (S.size() < 1) { ok = false; return -1; } int x = S.top(); S.pop(); S.push(-x); } else if (it->type == dupp) { if (S.size() < 1) { ok = false; return -1; } S.push(S.top()); } else if (it->type == swp) { if (S.size() < 2) { ok = false; return -1; } int a = S.top(); S.pop(); int b = S.top(); S.pop(); S.push(a); S.push(b); } else if (it->type == add) { if (S.size() < 2) { ok = false; return -1; } int a = S.top(); S.pop(); int b = S.top(); S.pop(); int ret = a+b; if (myabs(ret) > inf) { ok = false; return -1; } S.push(ret); } else if (it->type == sub) { if (S.size() < 2) { ok = false; return -1; } int a = S.top(); S.pop(); int b = S.top(); S.pop(); int ret = b-a; if (myabs(ret) > inf) { ok = false; return -1; } S.push(ret); } else if (it->type == mul) { if (S.size() < 2) { ok = false; return -1; } llint a = S.top(); S.pop(); llint b = S.top(); S.pop(); llint ret = b*a; if (myabs(ret) > inf) { ok = false; return -1; } S.push(ret); } else if (it->type == divv) { if (S.size() < 2) { ok = false; return -1; } llint a = S.top(); S.pop(); llint b = S.top(); S.pop(); llint ret = getSign(b, a) * (myabs(b)/myabs(a)); if (myabs(ret) > inf) { ok = false; return -1; } S.push(ret); } else if (it->type == mod) { if (S.size() < 2) { ok = false; return -1; } llint a = S.top(); S.pop(); llint b = S.top(); S.pop(); llint ret = getSign(b, a) * (myabs(b) % myabs(a)); if (myabs(ret) > inf) { ok = false; return -1; } S.push(ret); } } if (S.size() != 1) { ok = false; return -1; } return S.top(); } int main(void) { char buff[100]; for (; ;) { V.clear(); while (scanf("%s", buff) == 1) { if (buff[0] == 'Q') exit(0); if (buff[0] == 'E') break; if (!strcmp(buff, "NUM")) { int x; scanf("%d", &x); V.push_back(cmd(num, x)); } else if (!strcmp(buff, "POP")) { V.push_back(cmd(pop, -1)); } else if (!strcmp(buff, "INV")) { V.push_back(cmd(inv, -1)); } else if (!strcmp(buff, "DUP")) { V.push_back(cmd(dupp, -1)); } else if (!strcmp(buff, "SWP")) { V.push_back(cmd(swp, -1)); } else if (!strcmp(buff, "ADD")) { V.push_back(cmd(add, -1)); } else if (!strcmp(buff, "SUB")) { V.push_back(cmd(sub, -1)); } else if (!strcmp(buff, "MUL")) { V.push_back(cmd(mul, -1)); } else if (!strcmp(buff, "DIV")) { V.push_back(cmd(divv, -1)); } else if (!strcmp(buff, "MOD")) { V.push_back(cmd(mod, -1)); } } int n; scanf("%d", &n); for (int q = 0; q < n; ++q) { int x; scanf("%d", &x); int ok = true; int ret = eval(x, ok); if (!ok) puts ("ERROR"); else printf("%d\n", ret); } putchar('\n'); } return 0; }