#include using namespace std; using LL = long long int; #define incID(i, l, r) for(int i = (l) ; i < (r); ++i) #define decID(i, l, r) for(int i = (r) - 1; i >= (l); --i) #define incII(i, l, r) for(int i = (l) ; i <= (r); ++i) #define decII(i, l, r) for(int i = (r) ; i >= (l); --i) #define inc(i, n) incID(i, 0, n) #define dec(i, n) decID(i, 0, n) #define inc1(i, n) incII(i, 1, n) #define dec1(i, n) decII(i, 1, n) #define inID(v, l, r) ((l) <= (v) && (v) < (r)) #define inII(v, l, r) ((l) <= (v) && (v) <= (r)) #define PB push_back #define EB emplace_back #define MP make_pair #define FI first #define SE second #define FR front() #define BA back() #define ALL(v) v.begin(), v.end() #define RALL(v) v.rbegin(), v.rend() auto setmin = [](auto & a, auto b) { return (b < a ? a = b, true : false); }; auto setmax = [](auto & a, auto b) { return (b > a ? a = b, true : false); }; auto setmineq = [](auto & a, auto b) { return (b <= a ? a = b, true : false); }; auto setmaxeq = [](auto & a, auto b) { return (b >= a ? a = b, true : false); }; #define SI(v) static_cast(v.size()) #define RF(e, v) for(auto & e: v) #define until(e) while(! (e)) #define if_not(e) if(! (e)) #define ef else if #define UR assert(false) #define IN(T, ...) T __VA_ARGS__; IN_(__VA_ARGS__); void IN_() { }; template void IN_(T & a, U & ... b) { cin >> a; IN_(b ...); }; template void OUT(T && a) { cout << a << endl; } template void OUT(T && a, U && ... b) { cout << a << " "; OUT(b ...); } // ---- ---- template struct StrInt { string s; StrInt() { } StrInt(string t) { init(t); } StrInt(LL v) { init(v); } void init(string t) { bool flag = (t[0] == '-'); if(flag) { t = t.substr(1); } string u(D - t.size(), '0'); s = u + t; if(flag) { (*this) = -(*this); } } void init(LL v) { init(tostr(v)); } string tostr(LL x) { string s; bool f = (x < 0); if(f) { x *= -1; } while(x) { s.PB('0' + x % 10); x /= 10; } if(f) { s.PB('-'); } reverse(ALL(s)); return s; } StrInt & operator++() { dec(i, D) { s[i]++; if(s[i] > '9') { s[i] = '0'; } else { break; } } return (*this); } StrInt & operator--() { dec(i, D) { s[i]--; if(s[i] < '0') { s[i] = '9'; } else { break; } } return (*this); } StrInt operator+() const { return (*this); } StrInt operator-() const { StrInt y; y.init(s); --y; inc(i, D) { y.s[i] = '0' + ('9' - y.s[i]); } return y; } StrInt operator+(const StrInt & x) { StrInt y = x; dec(i, D) { y.s[i] += (s[i] - '0'); if(y.s[i] > '9') { y.s[i] -= 10; if(i != 0) { y.s[i - 1]++; } } } return y; } StrInt operator-(const StrInt & x) { return (*this) + (-x); } StrInt operator*(const StrInt & x) { StrInt y, z = x; y.init("0"); dec(i, D) { inc(j, s[i] - '0') { y = y + z; } StrInt v = z; inc(j, 9) { z = z + v; } } return y; } bool operator<(const StrInt & x) const { bool f1 = ( s[0] < '5'); bool f2 = (x.s[0] < '5'); if(f1 == f2) { return (s < x.s); } if(! f1 && f2) { return true; } if( f1 && ! f2) { return false; } } bool operator==(const StrInt & x) const { return (s == x.s); } bool operator<=(const StrInt & x) const { return ((*this) == x || (*this) < x); } bool operator>(const StrInt & x) const { return ! ((*this) <= x); } bool operator>=(const StrInt & x) const { return ! ((*this) < x); } }; template istream & operator>>(istream & is, StrInt & x) { string s; is >> s; x.init(s); return is; } template ostream & operator<<(ostream & os, const StrInt & x) { StrInt s = x; if(s.s[0] >= '5') { s = -s; os << "-"; } int p = D - 1; inc(i, D) { if(s.s[i] != '0') { p = i; break; } } os << s.s.substr(p); return os; } int main() { IN(string, s, t); s = "0" + s + t + "+"; vector u; int p = 0; inc(i, SI(s)) { if(s[i] == '+' || s[i] == '-') { u.PB(s.substr(p, i - p)); p = (s[i] == '+' ? i + 1 : i); } } StrInt<22> x(0), y; RF(e, u) { y.init(e); x = x + y; } OUT(x); }