import java.io.DataInputStream
import java.lang.StringBuilder
import java.math.BigInteger
import kotlin.math.absoluteValue

private fun readInts() = readLine()!!.split(' ').map { it.toInt() }

internal class FastReaderdsds() {
    private val inStream: DataInputStream = DataInputStream(System.`in`)
    private val bufferSize = 1024
    private var buffer = ByteArray(bufferSize)
    private var bufferPointer = 0
    private var bytesread = 0


    fun getNextDigit(): Int {
        var ret: Byte = readByte()
        while (ret <= ' '.toByte()) ret = readByte()
        return ret - '0'.toInt()
    }

    fun getDigitOrNegativeOne(): Int {
        var ret: Byte = readByte()
        if (ret <= ' '.toByte()) {
            return -1
        } else {
            return ret - '0'.toInt()
        }
    }


    fun getNextInt(): Int {
        var ret = 0
        var c: Byte = readByte()
        while (c <= ' '.toByte()) c = readByte()
        val neg = c == '-'.toByte()
        if (neg) c = readByte()
        do {
            ret = ret * 10 + c - '0'.toInt()
        } while (readByte().also({ c = it }) >= '0'.toByte() && c <= '9'.toByte())
        return if (neg) -ret else ret
    }

    private fun fillBuffer() {
        bytesread = inStream.read(buffer, 0, bufferSize)
        bufferPointer = 0
    }

    fun readByte(): Byte {
        if (bufferPointer == bytesread) {
            fillBuffer()
        }
        return buffer[bufferPointer++]
    }

    fun close() {
        inStream.close()
    }
}


fun main() {
    val rd = FastReaderdsds()


    val h = rd.getNextInt()
    val w = rd.getNextInt()

    if (h==1 || w == 1){
        print(1)
        return
    }

    val res = (h.toBigInteger() * w.toBigInteger() - BigInteger.ONE).divide(2.toBigInteger()) + BigInteger.ONE


    print(res)
}
