#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <map>
#include <iomanip>
#include <math.h> 
#include <stack>
#include <queue>
#include <bitset>
#include <cstdlib>
#include <tuple>
#include <cctype>
#include <ctype.h>
#include <set>
#include <sstream>
#include <time.h>
#include <numeric>
using namespace std;
//#define int long long
#define rep(i,s,n) for(int i = s;i<n;i++)
#define repe(i,s,n) for(int i = s;i<=n;i++)
#define rrep(i,s,n) for(int i = (n)-1;i>=(s);i--)
#define all(v) (v).begin(),(v).end()
#define pb push_back
#define fi first
#define se second
#define chmin(a,b) a=min((a),(b))
#define chmax(a,b) a=max((a),(b))
#define l1 list[index]
#define l2 list[index - 1]
#define l3 list[index + 1]
#define iif(i,j) ((i<0 && j<0) || (i>0 && j>0)) ? true : false 
typedef long long ll;
typedef pair<int, int>pint;
typedef vector<int>vint;
typedef vector<pint>vpint;
typedef pair<pint, int> P1;
typedef pair<int, pint> P2;
typedef pair<pint, pint> PP;
static const ll maxLL = (ll)1 << 62;
const ll MOD = 1000000007;
const ll INF = 1e18;
const double PI = 3.14159265359;
int ca[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };




signed main() {
	ll h, w, minn = INF;

	cin >> h >> w;
	ll h2 = w, w2 = h;

	if (h == 2 && w == 2) {
		cout << 1 << endl;
		return 0;
	}

	if (h >= 3) {
		for (ll i = 1; i <= h / 2; i++) {
			ll n1 = i * w;
		/*	for (ll j = i + 1, k = 0; k < h / 2; j++, k++) {
				ll n2 = (j - i) * w;
				ll n3 = (h * w) - (n1 + n2);
				ll n4 = abs(max({ n1,n2,n3 }) - min({ n1,n2,n3 }));
				minn = min(minn, n4);
			}*/
			if ((h - i) % 2 == 0) {
				ll n2 = ((h - i) / 2) * w;
				ll n4 = abs(n1 - n2);
				minn = min(minn, n4);
			}
			else if ((h - i) % 2 == 1) {
				ll n2 = ((h - i) / 2) * w;
				ll n3 = (h*w) - n1 - n2;
				ll n4 = abs(max({ n1,n2,n3 }) - min({ n1,n2,n3 }));
				minn = min(minn, n4);
			}
		}
	}

	if (h2 >= 3) {
		for (ll i = 1; i <= h2 / 2; i++) {
			ll n1 = i * w2;
		/*	for (ll j = i + 1, k = 0; k < h2 / 2; k++, j++) {
				ll n2 = (j - i) * w2;
				ll n3 = (h2 * w2) - (n1 + n2);
				ll n4 = abs(max({ n1,n2,n3 }) - min({ n1,n2,n3 }));
				minn = min(minn, n4);
			}*/
			if ((h2 - i) % 2 == 0) {
				ll n2 = ((h2 - i) / 2) * w2;
				ll n4 = abs(n1 - n2);
				minn = min(minn, n4);
			}
			else if ((h2 - i) % 2 == 1) {
				ll n2 = ((h2 - i) / 2) * w2;
				ll n3 = (h2 * w2) - n1 - n2;
				ll n4 = abs(max({ n1,n2,n3 }) - min({ n1,n2,n3 }));
				minn = min(minn, n4);
			}
		}

	}


	for (ll i = 1; i <= h / 2; i++) {
		ll n1 = i * w;
		if (w % 2 == 0) {
			ll n2 = (h - i) * (w / 2);
			ll n4 = abs(n1 - n2);
			minn = min(minn, n4);
		}
		else if (w % 2 == 1) {
			ll n2 = (h - i) * (w / 2);
			ll n3 = (h * w) - (n1 + n2);
			ll n4 = abs(max({ n1,n2,n3 }) - min({ n1,n2,n3 }));
			minn = min(minn, n4);
		}
	}


	for (ll i = 1; i <= h2 / 2; i++) {
		ll n1 = i * w2;
		if (w2 % 2 == 0) {
			ll n2 = (h2 - i) * (w2 / 2);
			ll n4 = abs(n1 - n2);
			minn = min(minn, n4);
		}
		else if (w2 % 2 == 1) {
			ll n2 = (h2 - i) * (w2 / 2);
			ll n3 = (h2 * w2) - (n1 + n2);
			ll n4 = abs(max({ n1,n2,n3 }) - min({ n1,n2,n3 }));
			minn = min(minn, n4);
		}
	}


	cout << minn << endl;


	return 0;
}

Measured memory_bytes: 256