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 JavaScript (node.js v5.12) (judge verdict: Runtime Error)

function pint(s)   { return parseInt(s);   }                                                                                                                                      function pfloat(s) { return parseFloat(s); }
function even(s)   { return (s % 2) === 0; }                                                                                                                                      function odd(s)    { return (s % 2) === 1; }
Array.prototype.sortNumAsc  = function ()  { return this.sort((a, b) => (a - b)); };                                                                                              Array.prototype.sortNumDesc = function ()  { return this.sort((a, b) => (b - a)); };
Array.prototype.sortStrAsc  = function ()  { return this.sort();                  };                                                                                              Array.prototype.sortStrDesc = function ()  { return this.sort().reverse();        };
Array.prototype.without     = function (x) { return this.filter(e => e !== x);    };                                                                                              function main(lines) {
  var a = lines[0].split(' ').map(pint);                                                                                                                                            var H = a[0];
  var W = a[1];                                                                                                                                                                     var min = Infinity;
  for (var o = 0; o < 2; o++) {                                                                                                                                                       for (var t = 0; t < 2; t++) {
      var T = (o === 0) ? [W, H] : [H, W];                                                                                                                                              var X = Math.round(T[0] / 3);
      var Y = T[0] - X;                                                                                                                                                                 var a = X * T[1];
      var U = (t === 0) ? [Y, T[1]] : [T[1], Y];                                                                                                                                        var Z = Math.round(U[0] / 2);
      var A = U[0] - Z;                                                                                                                                                                 var b = Z * U[1];
      var c = A * U[1];                                                                                                                                                                 var fs = prec(H, W, 3);                                                                                                                                                           var m = [a, b, c].sortNumDesc();
      min = Math.min(min, (m[0] - m[2]))                                                                                                                                              }
  }                                                                                                                                                                                 console.log(min);
}                                                                                                                                                                                 main(require("fs").readFileSync("/dev/stdin", "utf8").split('\n').map(l => l.trim()));