#include <bits/stdc++.h>
                                #include<iostream>
                                #include<cstdio>
                                #include<vector>
                                #include<queue>
                                #include<map>
                                #include<cstring>
                                #include<string>
                                #include <math.h>
                                #include<algorithm>
                            //    #include <boost/multiprecision/cpp_int.hpp>
                                #include<functional>
                       #define int long long
                                #define inf  10000000000007
                                #define pa pair<int,int>
                                #define ll long long
                                #define pal pair<double,pa>
                                #define ppa pair<pa,int>
                                #define ppap pair<int,pa>
                                #define ssa pair<string,int>
                                #define  mp make_pair
                                #define  pb push_back
                                #define EPS (1e-10)
                                #define equals(a,b) (fabs((a)-(b))<EPS)
                          
                                using namespace std;
                       
                                class Point{
                                    public:
                                    double x,y;
                                    Point(double x=0,double y=0):x(x),y(y) {}
                                    Point operator + (Point p) {return Point(x+p.x,y+p.y);}
                                    Point operator - (Point p) {return Point(x-p.x,y-p.y);}
                                    Point operator * (double a) {return Point(x*a,y*a);}
                                    Point operator / (double a) {return Point(x/a,y/a);}
                                    double absv() {return sqrt(norm());}
                                    double norm() {return x*x+y*y;}
                                    bool operator < (const Point &p) const{
                                        return x != p.x ? x<p.x: y<p.y;
                                    }
                                    bool operator == (const Point &p) const{
                                        return fabs(x-p.x)<EPS && fabs(y-p.y)<EPS;
                                    }
                                };
                                typedef Point Vector;
                          
                                struct Segment{
                                Point p1,p2;
                                };
                                 double dot(Vector a,Vector b){
                                    return a.x*b.x+a.y*b.y;
                                }
                                double cross(Vector a,Vector b){
                                    return a.x*b.y-a.y*b.x;
                                }
                             
    bool parareru(Point a,Point b,Point c,Point d){
    //  if(abs(cross(a-b,d-c))<EPS)cout<<"dd "<<cross(a-b,d-c)<<endl;
        return abs(cross(a-b,d-c))<EPS;
    }
    double distance_ls_p(Point a, Point b, Point c) {
      if ( dot(b-a, c-a) < EPS ) return (c-a).absv();
      if ( dot(a-b, c-b) < EPS ) return (c-b).absv();
      return abs(cross(b-a, c-a)) / (b-a).absv();
    }
    bool is_intersected_ls(Segment a,Segment b) {
        if(a.p1==b.p1||a.p2==b.p1||a.p1==b.p2||a.p2==b.p2) return false;
        if(parareru((a.p2),(a.p1),(a.p1),(b.p2))&&parareru((a.p2),(a.p1),(a.p1),(b.p1))){
    //      cout<<"sss"<<endl;
            if(dot(a.p1-b.p1,a.p1-b.p2)<EPS) return true;
            if(dot(a.p2-b.p1,a.p2-b.p2)<EPS) return true;
            if(dot(a.p1-b.p1,a.p2-b.p1)<EPS) return true;
            if(dot(a.p1-b.p2,a.p2-b.p2)<EPS) return true;
            return false;
        }
      else return ( cross(a.p2-a.p1, b.p1-a.p1) * cross(a.p2-a.p1, b.p2-a.p1) < EPS ) && ( cross(b.p2-b.p1, a.p1-b.p1) * cross(b.p2-b.p1, a.p2-b.p1) < EPS );
    }
      
    double segment_dis(Segment a,Segment b){
        if(is_intersected_ls(a,b))return 0;
        double r=distance_ls_p(a.p1, a.p2, b.p1);
        r=min(r,distance_ls_p(a.p1, a.p2, b.p2));
        r=min(r,distance_ls_p(b.p1, b.p2, a.p2));
        r=min(r,distance_ls_p(b.p1, b.p2, a.p1));
        return r;
    }
    Point intersection_ls(Segment a, Segment b) {
      Point ba = b.p2-b.p1;
      double d1 = abs(cross(ba, a.p1-b.p1));
      double d2 = abs(cross(ba, a.p2-b.p1));
      double t = d1 / (d1 + d2);
      
      return a.p1 + (a.p2-a.p1) * t;
    }
      
                    string itos( int i ) {
                    ostringstream s ;
                    s << i ;
                    return s.str() ;
                    }
                      
                    int gcd(int v,int b){
                        if(v>b) return gcd(b,v);
                        if(v==b) return b;
                        if(b%v==0) return v;
                        return gcd(v,b%v);
                    }
      
                    double distans(double x1,double y1,double x2,double y2){
                        double rr=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
                        return sqrt(rr);
                         
                    }
                    /*
    int pr[100010];
    //int inv[100010];
    */
    int beki(int wa,int rr,int warukazu){
        if(rr==0) return 1ll;
        if(rr==1) return wa%warukazu;
        if(rr%2==1) return (beki(wa,rr-1,warukazu)*wa)%warukazu;
        int zx=beki(wa,rr/2,warukazu);
        return (zx*zx)%warukazu;
    }
      /*
    void gya(){
        pr[0]=1;
        for(int i=1;i<100010;i++){
            pr[i]=(pr[i-1]*i)%inf;
        }
        for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);
         
    }
      
    */
     //sort(ve.begin(),ve.end(),greater<int>());
                             //----------------kokomade tenpure------------
    //vector<double> ans(100000000),ans2(100000000);
    /*
    int par[200100],ranks[200100],kosuu[200100];     
      
    void shoki(int n){
        for(int i=0;i<n;i++){
            par[i]=i;
            ranks[i]=0;
            kosuu[i]=1;
        }
    }
      
    int root(int x){
        return par[x]==x ? x : par[x]=root(par[x]);
    }
      
    bool same(int x,int y){
    return root(x)==root(y);
    }
      
    void unite(int x,int y){
     x=root(x);
     y=root(y);
        int xx=kosuu[x],yy=kosuu[y];
     if(x==y) return;
        if(ranks[x]<ranks[y]){
            par[x]=y;
            kosuu[y]=yy+xx;
        }
     else {
        par[y]=x;
        if(ranks[x]==ranks[y]) ranks[x]=ranks[x]+1;
        kosuu[x]=yy+xx;
     }
        return;
    }
    */
int dp[300][300][2];

int muri[300][300]={0};
string s;


int saiki(int l,int r,int ma){
	
//	cout<<l<<" "<<r<<" "<<ma<<endl;
	if(r<l) return -inf;
	if(dp[l][r][ma]!=-inf) return dp[l][r][ma];
	int ka=0;
	for(int i=l;i<=r;i++) if(s[i]>='0' && s[i]<='9')ka++;
	
	if(s[l]>='0' && s[l]<='9' && s[l+1]==')'){
		if(ka>1)muri[l][r]=1;
	}
	if(s[r]>='0' && s[r]<='9' && s[r-1]=='('){
		if(ka>1)muri[l][r]=1;
	}
	
	if(muri[l][r]==1) return (ma==1? -inf:inf);
	int l2=l,r2=r;
	while(s[l2]=='(') l2++;
	while(s[r2]==')') r2--;
	bool b=false;
	for(int i=l2;i<=r2;i++)if(s[i]=='('||s[i]==')') b=true;
	int la=-inf,mi=inf;
	if(!b){
		int su=0;
		int op=1;
		for(int i=l2;i<=r2;i+=2){
			if(i>l2) op= (s[i-1]=='+'? 1:-1);
			su += op*(s[i]-'0');
		}
		la=su,mi=su;
	}
	
	
	for(int i=l;i<=r;i++){
		int q1,q2;
		if(s[i]=='+'){
			 q1=saiki(l,i-1,1)+saiki(i+1,r,1);
			 q2=saiki(l,i-1,0)+saiki(i+1,r,0);
		}
		else if(s[i]=='-'){
			 q1=saiki(l,i-1,1)-saiki(i+1,r,0);
			 q2=saiki(l,i-1,0)-saiki(i+1,r,1);
		}
		else continue;
		
		if(muri[l][i-1]+muri[i+1][r]==2) continue;
		
		la=max(la,q1);
		mi=min(mi,q2);
	}
	dp[l][r][1]=la;
	dp[l][r][0]=mi;
	
//	cout<<l<<" "<<r<<" "<<1<<" "<<dp[l][r][1]<<endl;
//	cout<<l<<" "<<r<<" "<<0<<" "<<dp[l][r][0]<<endl;
	return dp[l][r][ma];
}

signed main(){

	for(int i=0;i<300;i++)for(int j=0;j<300;j++)for(int k=0;k<2;k++) dp[i][j][k]=-inf;
//	string s;
	cin>>s;
	
	
	int l=s.length();
	
	for(int i=0;i<l;i++) if(s[i]>='0'&&s[i]<='9'){
		dp[i][i][0]=s[i]-'0';
		dp[i][i][1]=s[i]-'0';
	}
	
	int it;
	int mae=1;
	dp[0][0][0]=1;
	
	cout<<saiki(0,l-1,1)<<endl;
    return 0;
}
### Prompt

Your task is to create a CPP solution to the following problem:

Tunnel formula

One day while exploring an abandoned mine, you found a long formula S written in the mine. If you like large numbers, you decide to take out the choke and add `(` or `)` so that the result of the formula calculation is as large as possible. If it has to be a mathematical formula even after adding it, how many can it be at the maximum?

There is enough space between the letters, and you can add as many `(` or `)` as you like. If the final formula is a formula, you may write `(` or `)` so that the correspondence of the first parenthesis is broken (see Sample 2). Also, here, <expr> defined by the following BNF is called a mathematical formula. All numbers in the formula are single digits.


<expr> :: = "(" <expr> ")"
| <term> "+" <term>
| <term> "-" <term>
<term> :: = <digit> | <expr>
<digit> :: = "0" | "1" | "2" | "3" | "4"
| "5" | "6" | "7" | "8" | "9"


Constraints

* 3 ≤ | S | ≤ 200



S represents a mathematical formula.

Input Format

Input is given from standard input in the following format.


S


Output Format

Output the answer as an integer.

Sample Input 1


1- (2 + 3-4 + 5)


Sample Output 1


Five


1- (2 + 3- (4 + 5)) is the maximum.

Sample Input 2


1- (2 + 3 + 4)


Sample Output 2


0


(1- (2 + 3) + 4) is the maximum.

Sample Input 3


1- (2 + 3)


Sample Output 3


-Four


Note that 1- (2) + (3) is not the formula here.





Example

Input

1-(2+3-4+5)


Output

5

### Response

```cpp
#include <bits/stdc++.h>
                                #include<iostream>
                                #include<cstdio>
                                #include<vector>
                                #include<queue>
                                #include<map>
                                #include<cstring>
                                #include<string>
                                #include <math.h>
                                #include<algorithm>
                            //    #include <boost/multiprecision/cpp_int.hpp>
                                #include<functional>
                       #define int long long
                                #define inf  10000000000007
                                #define pa pair<int,int>
                                #define ll long long
                                #define pal pair<double,pa>
                                #define ppa pair<pa,int>
                                #define ppap pair<int,pa>
                                #define ssa pair<string,int>
                                #define  mp make_pair
                                #define  pb push_back
                                #define EPS (1e-10)
                                #define equals(a,b) (fabs((a)-(b))<EPS)
                          
                                using namespace std;
                       
                                class Point{
                                    public:
                                    double x,y;
                                    Point(double x=0,double y=0):x(x),y(y) {}
                                    Point operator + (Point p) {return Point(x+p.x,y+p.y);}
                                    Point operator - (Point p) {return Point(x-p.x,y-p.y);}
                                    Point operator * (double a) {return Point(x*a,y*a);}
                                    Point operator / (double a) {return Point(x/a,y/a);}
                                    double absv() {return sqrt(norm());}
                                    double norm() {return x*x+y*y;}
                                    bool operator < (const Point &p) const{
                                        return x != p.x ? x<p.x: y<p.y;
                                    }
                                    bool operator == (const Point &p) const{
                                        return fabs(x-p.x)<EPS && fabs(y-p.y)<EPS;
                                    }
                                };
                                typedef Point Vector;
                          
                                struct Segment{
                                Point p1,p2;
                                };
                                 double dot(Vector a,Vector b){
                                    return a.x*b.x+a.y*b.y;
                                }
                                double cross(Vector a,Vector b){
                                    return a.x*b.y-a.y*b.x;
                                }
                             
    bool parareru(Point a,Point b,Point c,Point d){
    //  if(abs(cross(a-b,d-c))<EPS)cout<<"dd "<<cross(a-b,d-c)<<endl;
        return abs(cross(a-b,d-c))<EPS;
    }
    double distance_ls_p(Point a, Point b, Point c) {
      if ( dot(b-a, c-a) < EPS ) return (c-a).absv();
      if ( dot(a-b, c-b) < EPS ) return (c-b).absv();
      return abs(cross(b-a, c-a)) / (b-a).absv();
    }
    bool is_intersected_ls(Segment a,Segment b) {
        if(a.p1==b.p1||a.p2==b.p1||a.p1==b.p2||a.p2==b.p2) return false;
        if(parareru((a.p2),(a.p1),(a.p1),(b.p2))&&parareru((a.p2),(a.p1),(a.p1),(b.p1))){
    //      cout<<"sss"<<endl;
            if(dot(a.p1-b.p1,a.p1-b.p2)<EPS) return true;
            if(dot(a.p2-b.p1,a.p2-b.p2)<EPS) return true;
            if(dot(a.p1-b.p1,a.p2-b.p1)<EPS) return true;
            if(dot(a.p1-b.p2,a.p2-b.p2)<EPS) return true;
            return false;
        }
      else return ( cross(a.p2-a.p1, b.p1-a.p1) * cross(a.p2-a.p1, b.p2-a.p1) < EPS ) && ( cross(b.p2-b.p1, a.p1-b.p1) * cross(b.p2-b.p1, a.p2-b.p1) < EPS );
    }
      
    double segment_dis(Segment a,Segment b){
        if(is_intersected_ls(a,b))return 0;
        double r=distance_ls_p(a.p1, a.p2, b.p1);
        r=min(r,distance_ls_p(a.p1, a.p2, b.p2));
        r=min(r,distance_ls_p(b.p1, b.p2, a.p2));
        r=min(r,distance_ls_p(b.p1, b.p2, a.p1));
        return r;
    }
    Point intersection_ls(Segment a, Segment b) {
      Point ba = b.p2-b.p1;
      double d1 = abs(cross(ba, a.p1-b.p1));
      double d2 = abs(cross(ba, a.p2-b.p1));
      double t = d1 / (d1 + d2);
      
      return a.p1 + (a.p2-a.p1) * t;
    }
      
                    string itos( int i ) {
                    ostringstream s ;
                    s << i ;
                    return s.str() ;
                    }
                      
                    int gcd(int v,int b){
                        if(v>b) return gcd(b,v);
                        if(v==b) return b;
                        if(b%v==0) return v;
                        return gcd(v,b%v);
                    }
      
                    double distans(double x1,double y1,double x2,double y2){
                        double rr=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
                        return sqrt(rr);
                         
                    }
                    /*
    int pr[100010];
    //int inv[100010];
    */
    int beki(int wa,int rr,int warukazu){
        if(rr==0) return 1ll;
        if(rr==1) return wa%warukazu;
        if(rr%2==1) return (beki(wa,rr-1,warukazu)*wa)%warukazu;
        int zx=beki(wa,rr/2,warukazu);
        return (zx*zx)%warukazu;
    }
      /*
    void gya(){
        pr[0]=1;
        for(int i=1;i<100010;i++){
            pr[i]=(pr[i-1]*i)%inf;
        }
        for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);
         
    }
      
    */
     //sort(ve.begin(),ve.end(),greater<int>());
                             //----------------kokomade tenpure------------
    //vector<double> ans(100000000),ans2(100000000);
    /*
    int par[200100],ranks[200100],kosuu[200100];     
      
    void shoki(int n){
        for(int i=0;i<n;i++){
            par[i]=i;
            ranks[i]=0;
            kosuu[i]=1;
        }
    }
      
    int root(int x){
        return par[x]==x ? x : par[x]=root(par[x]);
    }
      
    bool same(int x,int y){
    return root(x)==root(y);
    }
      
    void unite(int x,int y){
     x=root(x);
     y=root(y);
        int xx=kosuu[x],yy=kosuu[y];
     if(x==y) return;
        if(ranks[x]<ranks[y]){
            par[x]=y;
            kosuu[y]=yy+xx;
        }
     else {
        par[y]=x;
        if(ranks[x]==ranks[y]) ranks[x]=ranks[x]+1;
        kosuu[x]=yy+xx;
     }
        return;
    }
    */
int dp[300][300][2];

int muri[300][300]={0};
string s;


int saiki(int l,int r,int ma){
	
//	cout<<l<<" "<<r<<" "<<ma<<endl;
	if(r<l) return -inf;
	if(dp[l][r][ma]!=-inf) return dp[l][r][ma];
	int ka=0;
	for(int i=l;i<=r;i++) if(s[i]>='0' && s[i]<='9')ka++;
	
	if(s[l]>='0' && s[l]<='9' && s[l+1]==')'){
		if(ka>1)muri[l][r]=1;
	}
	if(s[r]>='0' && s[r]<='9' && s[r-1]=='('){
		if(ka>1)muri[l][r]=1;
	}
	
	if(muri[l][r]==1) return (ma==1? -inf:inf);
	int l2=l,r2=r;
	while(s[l2]=='(') l2++;
	while(s[r2]==')') r2--;
	bool b=false;
	for(int i=l2;i<=r2;i++)if(s[i]=='('||s[i]==')') b=true;
	int la=-inf,mi=inf;
	if(!b){
		int su=0;
		int op=1;
		for(int i=l2;i<=r2;i+=2){
			if(i>l2) op= (s[i-1]=='+'? 1:-1);
			su += op*(s[i]-'0');
		}
		la=su,mi=su;
	}
	
	
	for(int i=l;i<=r;i++){
		int q1,q2;
		if(s[i]=='+'){
			 q1=saiki(l,i-1,1)+saiki(i+1,r,1);
			 q2=saiki(l,i-1,0)+saiki(i+1,r,0);
		}
		else if(s[i]=='-'){
			 q1=saiki(l,i-1,1)-saiki(i+1,r,0);
			 q2=saiki(l,i-1,0)-saiki(i+1,r,1);
		}
		else continue;
		
		if(muri[l][i-1]+muri[i+1][r]==2) continue;
		
		la=max(la,q1);
		mi=min(mi,q2);
	}
	dp[l][r][1]=la;
	dp[l][r][0]=mi;
	
//	cout<<l<<" "<<r<<" "<<1<<" "<<dp[l][r][1]<<endl;
//	cout<<l<<" "<<r<<" "<<0<<" "<<dp[l][r][0]<<endl;
	return dp[l][r][ma];
}

signed main(){

	for(int i=0;i<300;i++)for(int j=0;j<300;j++)for(int k=0;k<2;k++) dp[i][j][k]=-inf;
//	string s;
	cin>>s;
	
	
	int l=s.length();
	
	for(int i=0;i<l;i++) if(s[i]>='0'&&s[i]<='9'){
		dp[i][i][0]=s[i]-'0';
		dp[i][i][1]=s[i]-'0';
	}
	
	int it;
	int mae=1;
	dp[0][0][0]=1;
	
	cout<<saiki(0,l-1,1)<<endl;
    return 0;
}
```