#define _USE_MATH_DEFINES #include "bits/stdc++.h" using namespace std; #define FOR(i,j,k) for(int (i)=(j);(i)<(int)(k);++(i)) #define rep(i,j) FOR(i,0,j) #define each(x,y) for(auto &(x):(y)) #define mp make_pair #define MT make_tuple #define all(x) (x).begin(),(x).end() #define debug(x) cout<<#x<<": "<<(x)<; using vi = vector; using vll = vector; using Operators = array; vector> shuntingYard(const string &s, Operators operators) { stack stk; vector> re; for (int i = 0; i < sz(s);) { int nex = i + 1; if (s[i] == '(') { stk.push(i); } else if (s[i] == ')') { while (true) { int j = stk.top(); stk.pop(); if (s[j] == '(') { break; } else { re.emplace_back(j, j + 1); } } } else if (operators[s[i]] > 0) { while (!stk.empty() && operators[s[stk.top()]] >= operators[s[i]]) { int j = stk.top(); stk.pop(); re.emplace_back(j, j + 1); } stk.push(i); } else { while (nex < (int)s.size() && s[nex] != '(' && s[nex] != ')' && !operators[s[nex]]) { nex++; } re.emplace_back(i, nex); } i = nex; } while (!stk.empty()) { int i = stk.top(); stk.pop(); re.emplace_back(i, i + 1); } return re; } Operators ops; void solve() { ops['+'] = ops['-'] = 1; string S; cin >> S; vector segs = shuntingYard(S, ops); stack stk; each(p, segs) { char c = S[p.first]; if (isdigit(c)) { stk.push(c - '0'); } else { int y = stk.top(); stk.pop(); int x = stk.top(); stk.pop(); if (c == '+')stk.push(x + y); else stk.push(x - y); } } cout << stk.top() << endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout << fixed << setprecision(15); solve(); return 0; }