#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
#include <queue>
#include <cmath>
#include <algorithm>
#include <tuple>
#include <iomanip>
#include <stdio.h>
#include <numeric>
#include <map>
#include <bitset>
#include <set>
#include <stack>
#include <queue>

#define int long long
#define ull unsigned long long
#define all(a) a.begin(), a.end()
#define pii pair<int, int>
#define pb push_back
#define ld long double

using namespace std;

//const double PI = 3.14159265358;
const int INF = 10000000000;

long long gcd(long long a, long long b) {
    if (a==0) return b;
    if (b==0) return a;
    if (a>b) return gcd(a%b,b); else return gcd(b%a,a);
}
int prime(int p) {
    for (int i=2;i*i<=p;i++) {
        if (p%i==0 && i<p) return false;
    }
    return true;
}

double dist(int x1, int y1, int x2, int y2) {
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

string lower(string a) {
    int q = a.size();
    for (int i = 0; i < q; i++) {
        if (a[i] >= 'A' and a[i] <= 'Z') a[i] = char((a[i]-'A') + 'a');
    }
    return a;
}

int powmod(int a, int b, int mod) {
    if (a == 1 or b == 0) {if (mod == 1) return 0; else return 1;}
    if (b%2) {int k = powmod(a,b/2,mod); return ((k*k)%mod*a)%mod;}
    else {int k = powmod(a,b/2,mod); return (k*k)%mod;}
}

vector<int> nbase(int n, int base) {
    int cur = 0;
    vector<int> m(32, 0);
    while (n != 0) {
        m[cur] = n % base;
        n/=base;
        cur++;
    }
    int y = 0;
    for (int i = 31; i >= 0; i--) { if (m[i] != 0) {y=i;break;}}
    vector<int> ans(y+1);
    for (int i = 0; i < y+1; i++) ans[i]=m[i];
    return ans;
}

int phi(int b) {
    long long func=b;
    long long c=b;
    for (int i=2;i*i<=c;i++) { if (b%i==0) {func/=i; func*=i-1; } while (b%i==0) b/=i; }
    if (b!=1) { func/=b; func*=b-1; }
    return func;
}


vector<int> prefix_function (string s) {
    int n = s.size();
    vector<int> pi (n);
    for (int i=1; i<n; ++i) {
        int j = pi[i-1];
        while (j > 0 && s[i] != s[j])
            j = pi[j-1];
        if (s[i] == s[j])  ++j;
        pi[i] = j;
    }
    return pi;
}

//vector<int> z_function (string s) {
//    int n = s.size();
//    vector<int> z (n);
//    for (int i=1, l=0, r=0; i<n; ++i) {
//        if (i <= r)
//            z[i] = min (r-i+1, z[i-l]);
////        for (int j = i; j < i+z[i]; j++) rep[j]++;
//        while (i+z[i] < n && s[z[i]] == s[i+z[i]])
//            {++z[i];}
//        if (i+z[i]-1 > r)
//            l = i,  r = i+z[i]-1;
//        if (rep[i] > cur) {ans = i+1; cur = rep[i];}
//    }
//    return z;
//}

vector<vector<int>> pal(string s) {
    int n = s.size();
    vector<vector<int>> p(2,vector<int>(n,0));
    for(int z=0,l=0,r=0;z<2;z++,l=0,r=0)
        for(int i=0;i<n;i++)
        {
            if(i<r) p[z][i]=min(r-i+!z,p[z][l+r-i+!z]);
            int L=i-p[z][i], R=i+p[z][i]-!z;
            while(L-1>=0 && R+1<n && s[L-1]==s[R+1]) p[z][i]++,L--,R++;
            if(R>r) l=L,r=R;
    }
    return p;
}

const int mod = 1000000007;
//const int MAXN = 2020, MAXM = 10010;

int sub(int a, int b) {return ((a-b)%mod+mod)%mod;}

//int n;
//vector<vector<int>> s;
//vector<bool> used;

//void dfs(int v) {
//    used[v] = true;
//    int k = s[v].size();
//    for (int i = 0; i < k; i++) {
//        if (!used[s[v][i]]) {dfs(s[v][i]);}
//    }
//}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int a, b;
    cin >> a >> b;
    cout << max(a-b, max(a+b,a*b));
}


Measured memory_bytes: 256