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 Java8 (OpenJDK 1.8.0) (judge verdict: Runtime Error)

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		ArrayList<Integer> num = new ArrayList<Integer>();
		ArrayList<String> param = new ArrayList<String>();
		int system = 0; // 文字の空白区切り 0:ON 1:OFF
 
		while (sc.hasNext()) {
			if (sc.hasNextInt()) {
				num.add(sc.nextInt());
			} else {
				if (system == 0)
					param.add(sc.next());
				if (system == 1)
					param.add(sc.nextLine());
			}
		}
		Method(num, param);
	}
 
	static void Method(ArrayList<Integer> num, ArrayList<String> param) {
		BigInteger area = BigInteger.valueOf(num.get(0)).multiply(BigInteger.valueOf(num.get(1)));
		BigInteger min = new BigInteger(String.valueOf(Math.min(num.get(0), num.get(1))));
		BigInteger max = new BigInteger(String.valueOf(Math.max(num.get(0), num.get(1))));
		BigInteger big = new BigInteger("0");
		BigInteger answer = new BigInteger("999999999999999999999999");
 
		BigInteger two = new BigInteger("2");
		BigInteger three = new BigInteger("3");
 
		if(area.remainder(new BigInteger("3")).compareTo(BigInteger.ZERO) == 0){
				answer = big;
		}else if(area.remainder(new BigInteger("2")).compareTo(BigInteger.ZERO) == 0){
			if(min.remainder(two) != BigInteger.ZERO){
				big = min;
				min = max;
				max = big;
			}
			for(int i = 0; i < max.intValue(); i++){
				big = (new BigInteger(String.valueOf(i))).multiply(min);
				big = big.subtract((area.subtract(big)).divide(two));
				if(big.abs().compareTo(answer) < 0) answer = big.abs();
				if(area.compareTo(new BigInteger("100000")) > 0) System.exit(1);
			}
 
		}else{
			for(int i = 0; i < max.intValue(); i++){
				big = new BigInteger(String.valueOf(i)).multiply(min);
				if(big.abs().compareTo(area.divide(three)) < 0){
					big = area.subtract(big).subtract((area.subtract(big)).divide(min).multiply(min.divide(two))).subtract(big);
					if(big.abs().compareTo(answer) < 0) answer = big.abs();
					if(area.compareTo(new BigInteger("100000")) > 0) System.exit(1);
				} else {
					big = big.subtract((area.subtract(big)).divide(min).multiply(min.divide(two)));
					if(big.abs().compareTo(answer) < 0) answer = big.abs();
				}
			}
		}
		System.out.println(answer);
		//System.out.println(small);
		//System.out.println(big);
	}
}