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 <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int H, W;

long long int min(long long int x, long long int y) {
	if (x < y) { return x; }
	return y;
}

long long int calc(long long int a, long long int b, long long int c) {
	vector<long long int > V;
	V.push_back(a);
	V.push_back(b);
	V.push_back(c);
		sort(V.begin(), V.end());
	return V[2] - V[0];
}

int main(void) {

	cin >> H >> W;

	long long int ans = H*W;
	//1
	long long int a, b, c;
	a = W / 3;
	b = (W - a) / 2;
	c = W - a - b;
	long long int value = calc(a*H, b*H, c*H);
	ans = min(ans, value);

	

	//2
	a = H / 3;
	b = (H - a) / 2;
	c = H - a - b;
	value = calc(a*W, b*W, c*W);
	ans = min(ans, value);

	

	//3
	a = H/2;
	b = H-a;
	for (int x = 1; x <= W - 1; x++) {
		value = calc((long long int)x*H, a*(W - x), b*(W - x));
		//if (x == 33333) { cout << "H*x= " << (long long int) H*x << endl; }
		ans = min(ans, value);
	}

	

	//4
	a = W / 2;
	b = W - a;
	for (int x = 1; x <= H - 1; x++) {
		value = calc((long long int) W*x, a*(H - x), b*(H - x));
		ans = min(ans, value);
	}

	cout << ans << endl;

	

	//system("pause");
	return 0;
}