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 PyPy3 (2.4.0) (judge verdict: Wrong Answer)

h, w = (int(i) for i in input().split())
sel_row1 = 10000
sel_row2 = 10000
sel_col1 = 10000
sel_col2 = 10000
sel_row3 = 10000
sel_col3 = 10000

if h&1:
    if h%3 == 0:
        sel_row1 = h/3
        sel_row2 = h/3
    else:
        sel_row1 = h//3
        sel_row2 = sel_row1 +1
else:
    sel_row1 = h//3 if h//3 != 0 else 10000
    sel_row2 = sel_row1 + 1
if w&1:
    if w%3 == 0:
        sel_col1 = w//3
        sel_col2 = w//3
    else:
        sel_col1 = w//3
        sel_col2 = sel_col1 + 1
else:
    sel_col1 = w//3 if w//3 != 0 else 10000
    sel_col2 = sel_col1 + 1
if h&1 and w&1:
    sel_row3 = sel_row2 + 1
    sel_col3 = sel_col2 + 1
else:
    sel_row3 = h//2
    sel_col3 = w//2

ans = set()
if h%2 == 0 and w%2 == 0:
    ans.add(abs((sel_row3 * sel_col3) - (h * sel_col3)))
    ans.add(abs((sel_row3 * sel_col3) - (w * sel_row3)))
    ans.add(abs((sel_row3*(w-sel_col1) - h*sel_col1)))
    ans.add(abs((sel_row3*(w-sel_col2) - h*sel_col2)))
    ans.add(abs((sel_row3*w - (h-sel_row3)*sel_col1)))
    ans.add(abs((sel_row3*w - (h-sel_row3)*sel_col2)))
    ans.add(abs((sel_col3*(h-sel_row1) - w*sel_row1)))
    ans.add(abs((sel_col3*(h-sel_row2) - w*sel_row2)))
    ans.add(abs((sel_col3*h - (w-sel_col3)*sel_row1)))
    ans.add(abs((sel_col3*h - (w-sel_col3)*sel_row2)))
    print(int(min(ans)))
elif h%2 == 0:
    ans.add(abs(sel_col1*h - (w - sel_col1)*sel_row3))
    ans.add(abs(sel_col2*h - (w - sel_col2)*sel_row3))
    ans.add(abs(sel_row3*sel_col3 - h*(w - sel_col3)))
    ans.add(abs(sel_col3*sel_col3 - (h - sel_row3)*w))
    ans.add(abs(sel_row1*w - sel_row2*w))
    ans.add(abs(h*sel_col1 - h*sel_col2))
    print(int(min(ans)))
elif w%2 == 0:
    ans.add(abs(sel_row1*w - (h - sel_row1)*sel_col3))
    ans.add(abs(sel_row2*w - (h - sel_row2)*sel_col3))
    ans.add(abs(sel_row3*sel_col3 - h*(w - sel_col3)))
    ans.add(abs(sel_col3*sel_col3 - (h - sel_row3)*w))
    ans.add(abs(h*sel_col1 - h*sel_col2))
    ans.add(abs(sel_row1*w - sel_row2*w))
    print(int(min(ans)))
else:
    ans.add(abs(sel_row1*w - sel_row2*w))
    ans.add(abs(sel_col1*h - sel_col2*h))

    ans_set = {(sel_row1*w),(h-sel_row1)*(sel_col1),(h-sel_row1)*(w-sel_col1)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row1*w),(h-sel_row1)*(sel_col2),(h-sel_row1)*(w-sel_col2)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row1*w),(h-sel_row1)*(sel_col3),(h-sel_row1)*(w-sel_col3)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row2*w),(h-sel_row2)*(sel_col1),(h-sel_row2)*(w-sel_col1)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row2*w),(h-sel_row2)*(sel_col2),(h-sel_row2)*(w-sel_col2)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row2*w),(h-sel_row2)*(sel_col3),(h-sel_row2)*(w-sel_col3)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row3*w),(h-sel_row3)*(sel_col1),(h-sel_row3)*(w-sel_col1)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row3*w),(h-sel_row3)*(sel_col2),(h-sel_row3)*(w-sel_col2)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row3*w),(h-sel_row3)*(sel_col3),(h-sel_row3)*(w-sel_col3)}
    ans.add(max(ans_set) - min(ans_set))


    ans_set = {(sel_row1)*(w-sel_col1),h*(sel_col1),(h-sel_row1)*(w-sel_col1)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row1)*(w-sel_col2),h*(sel_col2),(h-sel_row1)*(w-sel_col2)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row1)*(w-sel_col3),h*(sel_col3),(h-sel_row1)*(w-sel_col3)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row2)*(w-sel_col1),h*(sel_col1),(h-sel_row2)*(w-sel_col1)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row2)*(w-sel_col2),h*(sel_col2),(h-sel_row2)*(w-sel_col2)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row2)*(w-sel_col3),h*(sel_col3),(h-sel_row2)*(w-sel_col3)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row3)*(w-sel_col1),h*(sel_col1),(h-sel_row3)*(w-sel_col1)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row3)*(w-sel_col2),h*(sel_col2),(h-sel_row3)*(w-sel_col2)}
    ans.add(max(ans_set) - min(ans_set))
    ans_set = {(sel_row3)*(w-sel_col3),h*(sel_col3),(h-sel_row3)*(w-sel_col3)}
    ans.add(max(ans_set) - min(ans_set))

    print(int(min(ans)))