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 Go (1.6) (judge verdict: Accepted)

package main

import "fmt"

func min(a, b int64) int64 {
	if a > b {
		return b
	}
	return a
}

func minMax(a, b, c int64) (min, max int64) {
	if a > b {
		a, b = b, a
	}
	if a > c {
		a, c = c, a
	}
	if b > c {
		b, c = c, b
	}
	min = a
	max = c
	return
}

func divideVerticalDiff(h, w, x int64) int64 {
	s1 := x * h
	w1 := (w - x) / 2
	w2 := (w - x) - w1
	s2 := w1 * h
	s3 := w2 * h
	min, max := minMax(s1, s2, s3)
	return max - min
}

func divideHorizontalDiff(h, w, x int64) int64 {
	s1 := x * h
	h1 := h / 2
	h2 := h - h1
	s2 := (w - x) * h1
	s3 := (w - x) * h2
	min, max := minMax(s1, s2, s3)
	return max - min
}

func calcMin(h, w int64) int64 {
	result := int64(10000000000)
	for x := int64(0); x <= w; x++ {
		minDiff := min(divideVerticalDiff(h, w, x), divideHorizontalDiff(h, w, x))
		if minDiff < result {
			result = minDiff
		}
	}
	return result
}

func main() {
	var h, w int64
	fmt.Scan(&h, &w)

	fmt.Println(min(calcMin(h, w), calcMin(w, h)))
}