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# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

public class Program
{
    public static decimal ans = decimal.MaxValue;

    public static void Main() {
        Reader reader = new Reader(Console.In);
        int H = reader.RInt();
        int W = reader.Int();

        if (W > H) {
            int temp = H;
            H = W;
            W = temp;
        }

        CalcA(H, W);
        CalcA(W, H);
        CalcB(H, W);
        CalcB(W, H);

        Console.WriteLine((long)ans);
    }

    public static void CalcA(int H, int W) {
        for (decimal i = 1; i < H; i++) {
            decimal a = i * W;

            decimal bh = (H - i) / 2;
            decimal ch = H - i - bh;

            Diff(a, bh * W, ch * W);
            if (ans == 0) {
                return;
            }
        }
    }

    public static void CalcB(int H, int W) {
        for (decimal i = 1; i < H; i++) {
            decimal a = i * W;

            decimal bw = W / 2;
            decimal cw = W - bw;

            decimal b = (H - i) * bw;
            decimal c = (H - i) * cw;

            Diff(a, b, c);
            if (ans == 0) {
                return;
            }
        }
    }

    public static void Diff(decimal a, decimal b, decimal c) {
        var list = new List<decimal> { a, b, c };
        decimal diff = list.Max() - list.Min();

        if (diff < ans) {
            ans = diff;
        }
    }
}

public class Reader
{
    private readonly TextReader reader;
    private readonly char separator = ' ';
    private string[] A = new string[0];
    private int i;

    public Reader(TextReader r) { reader = r; }

    public string String() { return Set(); }
    public int Int() { return int.Parse(Set()); }
    public long Long() { return long.Parse(Set()); }
    public decimal Decimal() { return decimal.Parse(Set()); }

    public string RString() { return RSet(); }
    public int RInt() { return int.Parse(RSet()); }
    public long RLong() { return long.Parse(RSet()); }
    public decimal RDecimal() { return decimal.Parse(RSet()); }

    public int[] IntArray() { return A.Select(x => int.Parse(x)).ToArray(); }

    private void Read() {
        string line = reader.ReadLine();

        A = line.Split(separator);
        i = 0;
    }

    private string Set() { return A[i++]; }
    private string RSet() { Read(); return A[i++]; }
}