#include <bits/stdc++.h>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using bint = boost::multiprecision::cpp_int;
using ll = long long;
using pint = pair<int, int>;
using pll = pair<ll, ll>;
#define rep(i,n) for (int i = 0; i < (n); i++)
#define repSE(i,s,n) for (int i = (s); i < (n); i++)
#define rrepSE(i,s,e) for (int i = (s); i > (e); i--)
#define ssort(v) sort(v.begin(), v.end())
#define gsort(v) sort(v.rbegin(), v.rend())
template<typename T> istream &operator>>(istream &is, vector<T> &vec){ for (auto &v : vec) is >> v; return is; }
template<typename T> ostream &operator<<(ostream &os, const vector<T> &vec){ os << "["; for (auto v : vec) os << v << ","; os << "]"; return os; }
template<typename T> ostream &operator<<(ostream &os, const deque<T> &vec){ os << "deq["; for (auto v : vec) os << v << ","; os << "]"; return os; }
template<typename T> ostream &operator<<(ostream &os, const set<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> ostream &operator<<(ostream &os, const unordered_set<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> ostream &operator<<(ostream &os, const multiset<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> ostream &operator<<(ostream &os, const unordered_multiset<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T1, typename T2> ostream &operator<<(ostream &os, const pair<T1, T2> &pa){ os << "(" << pa.first << "," << pa.second << ")"; return os; }
template<typename TK, typename TV> ostream &operator<<(ostream &os, const map<TK, TV> &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; }
template<typename TK, typename TV> ostream &operator<<(ostream &os, const unordered_map<TK, TV> &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; }
template<typename T> bool chmax(T &m, const T q) { if (m < q) {m = q; return true;} else return false; }
template<typename T> bool chmin(T &m, const T q) { if (q < m) {m = q; return true;} else return false; }
#define DEBUG_PRINT(var) std::cout << #var << " = " << var << "\n";

int main()
{
    ll h, w;
    cin >> h >> w;
    if (h % 3 == 0 || w % 3 == 0) {
        cout << 0 << endl;
        return 0;
    }
    ll ans = h*w;
    auto divH = [&]() {
        ll h3 = h/3, w3 = w/3, h2 = h/2, w2 = w/2;
        ll s1 = h3*w, s2 = (h - h3)*w2, s3 = (h-h3)*(w-w2);
        ll diff = max(s1,(max(s2,s3))) - min(s1,(min(s2,s3)));
        chmin(ans, diff);
        //
        s2 = (h-h3)*(w2+1);
        s3 = (h-h3)*(w-w2-1);
        diff = max(s1,(max(s2,s3))) - min(s1,(min(s2,s3)));
        chmin(ans, diff);
        //
        s3 = (h - 2*h3) * w;
        diff = s3 - s1;
        chmin(ans, diff);
        //
        s2 = (h3+1)*w; s3 = (h - 2*h3 - 1)*w;
        diff = max(s2,s3) - min(s1,s3);
        chmin(ans, diff);
        ////
        s1 = (h3+1)*w, s2 = (h - h3 - 1)*w2, s3 = (h-h3-1)*(w-w2);
        diff = max(s1,(max(s2,s3))) - min(s1,(min(s2,s3)));
        chmin(ans, diff);
        //
        s2 = (h - h3 - 1)*(w2+1), s3 = (h-h3-1)*(w-w2-1);
        diff = max(s1,(max(s2,s3))) - min(s1,(min(s2,s3)));
        chmin(ans, diff);
    };
    divH();
    swap(h,w);
    divH();
    cout << ans << "\n";
    return 0;
}


Measured memory_bytes: 3612