fun main(args: Array<String>) {
    val (H, W) = readLine()!!.split(" ").map { it.toLong() }

    // Tips: 全てを解析的に求める方針は筋が悪い 数値 * 解析 の組み合わせで実装する方針だと簡単に解ける良い例


    var ans = Long.MAX_VALUE

    fun calc(h: Long, w: Long) {
        for ( i in 1..h-1) {
            var one = i * w

            // 全て横分割ケース
            var two = ((h-i)/2) * w
            var three = ((h-i) - (h-i)/2) * w

            var listH = listOf(one, two, three)
            ans = Math.min(listH.max()!!-listH.min()!!, ans)

            // 横１縦２分割ケース
            var twoV = (h-i) * (w/2)
            var threeV = (h-i) * (w - w/2)
            var listV = listOf(one, twoV, threeV)
            ans = Math.min(listV.max()!!-listV.min()!!, ans)
        }
    }


    calc(H, W)
    // 縦横入れ替えた場合も計算
    calc(W, H)

    println(ans)

    /**
    // ２パターンの方法で行ける気がする
    if ( h%3==0L || w%3==0L) {
        println(0)
        return
    }

    // どちらか一方でも偶数の場合
    if ( h%2==0L || w%2==0L) {
        // 奇数の側でまず分割し，偶数側で残った大きい方を分割
        if( w%2 == 0L) {
            val one = h/2 * w
            val two = (h/2 + 1) * (w/2)

            println(Math.abs(one-two))
            return
        } else {
            val one = w/2 * h
            val two = (w/2 + 1) * (h/2)

            println(Math.abs(one-two))
            return
        }

    }

    // 両方とも奇数の場合
    val one = h/2 * w
    val two = (h/2 + 1) * (w/2)

    println(Math.abs(one-two))
    **/
}