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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<vector> 
#include<limits>
#include<numeric>
#include<type_traits>
#include<math.h>
using namespace std;
typedef long long ll;

#define rep(i, n) for(int i = 0; i < (int)(n); i++)
#define repi(i,a,b) for(int i = (int)(a); i < (int)(b); i++)
#define in(x) cin >> x
#define out(str) cout << str << endl

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

ll H,W,ans=1e9,A,B,C;
ll ave,ave2;

int main(){
    cin>>H>>W;
    if(H%3==0||W%3==0){
        out(0);
        return 0;
    }
    else{
        ave=(H*W)/3;
        //tate
        rep(i,W){
            if((i+1)*H>ave){
                ave2=(H*(W-i))/2;
                A=i*H;
                rep(j,H){
                    if((j+1)*(W-i)>ave2){
                        B=(H-j)*(W-i);
                        C=j*(W-i);
                        ans=min(ans,max(A,max(B,C))-min(A,min(B,C)));
                        B=(H-j-1)*(W-i);
                        C=(j+1)*(W-i);
                        ans=min(ans,max(A,max(B,C))-min(A,min(B,C)));
                        break;
                    }
                }
                ave2=(H*(W-i-1))/2;
                A=(i+1)*H;
                rep(j,H){
                    if((j+1)*(W-i-1)>ave2){
                        B=(H-j)*(W-i-1);
                        C=j*(W-i-1);
                        ans=min(ans,max(A,max(B,C))-min(A,min(B,C)));
                        B=(H-j-1)*(W-i-1);
                        C=(j+1)*(W-i-1);
                        ans=min(ans,max(A,max(B,C))-min(A,min(B,C)));
                        break;
                    }
                }
                break;
                out(ave);
            }
        }
        rep(i,H){
            if((i+1)*W>=ave){
                ave2=(W*(H-i))/2;
                A=i*W;
                rep(j,W){
                    if((j+1)*(H-i)>ave2){
                        B=(W-j)*(H-i);
                        C=j*(H-i);
                        ans=min(ans,max(A,max(B,C))-min(A,min(B,C)));
                        B=(W-j-1)*(H-i);
                        C=(j+1)*(H-i);
                        ans=min(ans,max(A,max(B,C))-min(A,min(B,C)));
                        break;
                    }
                }
                ave2=(W*(H-i-1))/2;
                A=(i+1)*W;
                rep(j,W){
                    if((j+1)*(H-i-1)>ave2){
                        B=(W-j)*(H-i-1);
                        C=j*(H-i-1);
                        ans=min(ans,max(A,max(B,C))-min(A,min(B,C)));
                        B=(W-j-1)*(H-i-1);
                        C=(j+1)*(H-i-1);
                        ans=min(ans,max(A,max(B,C))-min(A,min(B,C)));
                        break;
                    }
                }
                break;
            }
        }
        out(ans);
    }
}