import java.{util => ju}
import scala.collection.{mutable => mu}
import MyPredef._


object Main extends App {
    val H,W = nextInt
    val h=Math.min(H,W)
    val w=Math.max(H,W)
    
    val res = if(h%3==0||w%3==0){
        0
    }else{
        val x = Math.round(w/3.0)
        val wx = w-x
        val h0 = h/2
        val h1 = h/2+h%2
        val can0 = Seq(x*h,wx*h0,wx*h1)
        val res0 = can0.max-can0.min
        
        /*
        val _x = (w+2)/3
        val _wx = w-_x
        val _can0 = Seq(_x*h,_wx*h0,_wx*h1)
        val _res0 = _can0.max-_can0.min
        */
        
        /*
        println(can)
        println(w)
        println(can.max)
        println(can.min)
        println(can.max-can.min)
        println(w)
        println(Math.min(w,can.max-can.min))
        */
        
        val y = Math.round(h/3.0)
        val hy = h-y
        val w0 = w/2
        val w1 = w/2+w%2
        val can1 = Seq(y*h,hy*w0,hy*w1)
        val res1 = can1.max-can1.min
        
        /*
        val _y = (h+2)/3
        val _hy = h-y
        val _can1 = Seq(_y*h,_hy*w0,_hy*w1)
        val res1 = can1.max-can1.min
        */
        
        Seq(h,res0,res1).min
    }
    
    println(res)
}


object MyPredef {
  @inline def rep(n: Int, f: => Unit): Unit = { var c = 0; while (c < n) { f; c += 1 } }
  @inline def rep(n: Int, f: Int => Unit): Unit = { var c = 0; while (c < n) { f(c); c += 1 } }

  private val buf = new Array[Byte](1024); private var ptr = 0; private var len = 0
  @inline private def isPrintableChar(c: Int): Boolean = 33 <= c && c <= 126
  @inline private def hasNextByte(): Boolean =
    if (ptr >= len) { ptr = 0; len = System.in.read(buf); len > 0 } else { true }
  @inline private def hasNext(): Boolean = {
    while (hasNextByte() && !isPrintableChar(buf(ptr))) ptr += 1
    hasNextByte()
  }
  @inline private def readByte(): Byte =
    if (hasNextByte()) { val res = buf(ptr); ptr += 1; res } else { -1 }
  def next(): String = {
    if(!hasNext()) ???
    val sb = new StringBuilder; var b = readByte()
    while (isPrintableChar(b)) { sb.append(b.toChar); b = readByte() }
    sb.toString
  }
  def nextInt(): Int = {
    val n = nextLong()
    if (n < Int.MinValue || Int.MaxValue < n) ???
    n.toInt
  }
  def nextLong(): Long = {
    if(!hasNext()) ???
    var minus = false; var b = readByte()
    if (b == '-') { minus = true; b = readByte() }
    def go (b: Byte, n: Long = 0): Long =
      if ('0' <= b && b <= '9') { go(readByte(), n * 10 + b - '0') }
      else if (minus) { -n } else { n }
    go(b)
  }
  def nextDouble(): Double = next.toDouble
}
object MyArray {
  def fillT[T : scala.reflect.ClassTag](dimX: Int, dimY: Int)(f: => T): Array[Array[T]] = {
    val arrs = Array.ofDim[T](dimX, dimY)
    for {
      y <- (0 until dimY)
      x <- (0 until dimX)
    } {
      arrs(x)(y) = f
    }
    arrs
  }
}