#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define FOR2(i,a,b) for (int i = (a); i > (b); ++i) #define DEBUG(x) cout << '>' << #x << ':' << x << endl; inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; } const int INF = 1<<29; typedef long long ll; ////////////////////////////////////////////////////////////////////////////// const int MAX = 101; struct rec { int num; char op; } input[MAX]; char text[MAX*5]; ll minim[MAX][MAX], maxim[MAX][MAX]; void go(int be, int en) { if (minim[be][en] != -1) return; if (be == en) { minim[be][en] = maxim[be][en] = input[be].num; return; } FOR(i, be, en) { go(be, i); go(i+1, en); ll res1, res2; if (input[i+1].op == '+') { res1 = minim[be][i]+minim[i+1][en]; res2 = maxim[be][i]+maxim[i+1][en]; } else { res1 = minim[be][i]*minim[i+1][en]; res2 = maxim[be][i]*maxim[i+1][en]; } if (minim[be][en] == -1 || minim[be][en] > res1) minim[be][en] = res1; if (maxim[be][en] == -1 || maxim[be][en] < res2) maxim[be][en] = res2; } } int main() { while (1) { gets(text); int len = strlen(text); if (text[0] == 'E') break; int P = 0, index = 0, n = 0; char op = '+'; while (index < len) { n = 0; while (index < len && isdigit(text[index])) n = n*10+text[index++]-'0'; input[P].num = n; input[P].op = op; ++P; if (index == len) break; op = text[index++]; } memset(minim, -1, sizeof(minim)); memset(maxim, -1, sizeof(maxim)); go(0, P-1); cout << minim[0][P-1] << " " << maxim[0][P-1] << endl; } return 0; }