Problem:
Score : 400 points

Problem Statement

There is a bar of chocolate with a height of H blocks and a width of W blocks.
Snuke is dividing this bar into exactly three pieces.
He can only cut the bar along borders of blocks, and the shape of each piece must be a rectangle.

Snuke is trying to divide the bar as evenly as possible.
More specifically, he is trying to minimize S_{max} - S_{min}, where S_{max} is the area (the number of blocks contained) of the largest piece, and S_{min} is the area of the smallest piece.
Find the minimum possible value of S_{max} - S_{min}.

Constraints

2 ≤ H, W ≤ 10^5

Input

Input is given from Standard Input in the following format:

H W

Output

Print the minimum possible value of S_{max} - S_{min}.

Sample Input 1

3 5

Sample Output 1

0

In the division below, S_{max} - S_{min} = 5 - 5 = 0.

Sample Input 2

4 5

Sample Output 2

2

In the division below, S_{max} - S_{min} = 8 - 6 = 2.

Sample Input 3

5 5

Sample Output 3

4

In the division below, S_{max} - S_{min} = 10 - 6 = 4.

Sample Input 4

100000 2

Sample Output 4

1

Sample Input 5

100000 100000

Sample Output 5

50000

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>

using namespace std;

#define rep2(x,fr,to) for(int (x)=(fr);(x)<(to);(x)++)
#define rep(x,to) for(int (x)=0;(x)<(to);(x)++)
#define repr(x,fr,to) for(int (x)=(fr);(x)>=(to);(x)--)
#define all(c) (c).begin(),(c).end()
#define sz(v) (int)(v).size()

typedef long long ll; typedef vector<int> VI; typedef pair<int,int> pii;
const ll mod = 1e9+7;

int main()
{
	
	//cin.tie(0); ios_base::sync_with_stdio(false);
	ll h,w;
	cin >> h >>w;
	//if(h%3==0 || w%3==0){ puts("0"); return 0;}
	
	ll h3= h/3;
	ll ans = 1LL<<50;
	rep2(i, max(h3-2,1LL), min(h3+3,h)){
		ll m1 = w*i;
		ll m2 = (h-i) * (w/2);
		ll m3 = (h-i) * (w - w/2);
		ll mn = min({m1, m2, m3});
		if(mn<1) continue;
		ll mx = max({m1, m2, m3});
		//printf("%lld;%lld:%lld:%lld,  ",i,m1,m2,m3);
		ans = min(ans, mx-mn);
	}
	ll w3 = w/3;
	rep2(i, max(w3-2,1LL), min(w3+3,w)){
		ll m1 = h*i;
		ll m2 = (w-i) * (h/2);
		ll m3 = (w-i) * (h - h/2);
		ll mn = min({m1, m2, m3});
		if(mn<1) continue;
		ll mx = max({m1, m2, m3});
		//printf("%lld;%lld:%lld:%lld,  ",i,m1,m2,m3);
		ans = min(ans, mx-mn);
	}

	
	
	cout << ans <<"\n";
	return 0;
}