Cod sursa(job #3159152)

Utilizator David2007David Preda David2007 Data 20 octombrie 2023 20:06:50
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.6 kb
#include <bits/stdc++.h>


using namespace std;

ifstream f("emm.in");
ofstream g("emm.out");

char s[100005];
int st[100005];

/**
( = -1
m = -2
M = -3

(50 -2 6) -3 80 -2 55
-1 5 0 -2 6
6 -3 80 -2 55
*/
void Solve()
{
    int top, val, i, j, p, x;
    char ch;

    top = 0;
    val = -1;
    for(i = 0; s[i] != 0; i++)
    {
        ch = s[i];
        if(ch == '(')
        {
            /// am pus paranteza deschisa in stiva
            st[++top] = -1;
        }
        /**
        5213m45
        */
        else if(ch == 'm'){
            if(val >= 0){
                st[++top] = val;
                val = -1;
            }
            /// am pus m in stiva
            st[++top] = -2;
        }
        /**
        5213M45
        */
        else if(ch == 'M'){
            if(val >= 0){
                st[++top] = val;
                val = -1;
            }
            /// am pus M in stiva
            st[++top] = -3;
        }
        /**
        5213
        pt 5: val = 5
        pt 2: val = 5*10 + 2
        pt 1: val = 52*10 + 1
        pt 3: val = 521*10 +3
        */
        else if(ch >= '0' && ch <= '9'){
            if(val == -1)
                val = (ch - '0');
            else
                val = val * 10 + (ch - '0');
        }
        /**
        paranteza inchisa
        (50 -2 6)
        -1 50 -2 6
        */
        else{
            if(val >= 0){
                st[++top] = val;
                val = -1;
            }
            ///merg inapoi pana la paranteza deschisa -1
            /**
            j = top;
            while(st[j] != -1){
                j--;
            }
            */

            for(j = top; st[j] != -1; j--)
                ;
            ///evaluam expresia
            ///-1 50 -2 6 -3 8
            /**
            -1 50 -2 6 -3 8
            x = 50
            x = 6
            x = 8
            -1 50 -2 6 -3 8 => 8
            */
            x = st[j + 1];
            for(p = j + 3; p <= top; p += 2){
                if(st[p - 1] == -2)
                    x = min(x, st[p]);
                else x = max(x, st[p]);
            }
            top = j;
            st[top] = x;
        }
    }
    ///5m8M60m4M85
    ///5 -2 8 -3 60 -2 4 -3
    if(val >= 0){
        st[++top] = val;
        val = -1;
    }
    ///evaluam expresia
    x = st[1];
    for(p = 3; p <= top; p += 2){
        if(st[p - 1] == -2)
            x = min(x, st[p]);
        else x = max(x, st[p]);
    }
    g << x << "\n";
}

int main()
{
    f >> s;
    Solve();
    return 0;
}