#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;
        //tateon
        rep(i,W){
            if((i+1)*H>ave){
                A=B=i*H;
                C=(W-2*i)*H;
                ans=min(ans,max(A,max(B,C))-min(A,min(B,C)));
                A=B=(i+1)*H;
                C=(W-2*(i+1))*H;
            }
        }
        rep(i,H){
            if((i+1)*W>ave){
                A=B=i*W;
                C=(H-2*i)*W;
                ans=min(ans,max(A,max(B,C))-min(A,min(B,C)));
                A=B=(i+1)*W;
                C=(H-2*(i+1))*W;
            }
        }
        //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);
    }
}


Measured memory_bytes: 256