#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,m,n) for (int i = m; i < n; i++) #define MAXLLI (1ll<<62) char vstup[500]; int cisla[110], op[110], n; long long int minar[110][110], maxar[110][110]; void vyres(int zac, int kon, long long int *minRes, long long int *maxRes) { //printf("vyres %d %d\n", zac, kon); if (zac == kon) { *minRes = *maxRes = cisla[zac]; return; } if (zac == kon - 1) { if (op[zac] == 0) *minRes = *maxRes = cisla[zac] + cisla[zac + 1]; else *minRes = *maxRes = cisla[zac] * cisla[zac + 1]; return; } if (minar[zac][kon] == -1 || maxar[zac][kon] == -1) { long long int m1 = MAXLLI, m2 = 0; for (int i = zac; i < kon; i++) { long long int l1, l2, u1, u2, mi, ma; vyres(zac,i,&l1, &u1); vyres(i+1,kon,&l2, &u2); if (op[i] == 0) { mi = l1 + l2; ma = u1 + u2; } else { mi = l1 * l2; ma = u1 * u2; } if (mi < m1) m1 = mi; if (ma > m2) m2 = ma; } minar[zac][kon] = m1; maxar[zac][kon] = m2; } *maxRes = maxar[zac][kon]; *minRes = minar[zac][kon]; } int main() { while (1) { gets(vstup); if (vstup[0] == 'E') break; int i = 0, cis = 0; n = 0; while (vstup[i] > 0) { if (vstup[i] == '+') { op[n] = 0; cisla[n] = cis; n++; cis = 0; } else if (vstup[i] == '*') { op[n] = 1; cisla[n] = cis; n++; cis = 0; } else { cis *= 10; cis += vstup[i] - '0'; } i++; } cisla[n] = cis; FOR(j,0,n+2) { FOR(k,0,n+2) { minar[j][k] = -1; maxar[j][k] = -1; } } long long int m1, m2; vyres(0, n, &m1, &m2); printf("%lld %lld\n", m1, m2); } return 0; }