import kotlin.math.absoluteValue
import kotlin.math.min

fun main() {
    val ln = nextLongList()
    val ans = solve(ln)
    println(ans)
}


fun solve(ln: List<Long>): Long {
    val currentPoint = ln[0]
    val moveCount = ln[1]
    val moveAmount = ln[2]


    //移動する必要がある
    if (currentPoint.absoluteValue > moveAmount) {
        //一時的にに移動する回数
        //moveAmountを超える回数まで移動したあとは偶数か奇数かで移動回数が決まる。0回か1回
        //moveAmountを超える回数までの移動回数は？　→　初期値が一番0に近づくポイントへ近づく移動回数。
        // ただし与えられている移動回数を超えることはできない。
        val tempMoveCount =
            if (currentPoint.absoluteValue / moveAmount > moveCount)
                moveCount
            else
                currentPoint.absoluteValue / moveAmount

        //一度絶対値付近まで移動させる
        val tempPoint = calculateMinPoint(
            point = currentPoint,
            moveCount = tempMoveCount,
            moveAmount = moveAmount
            )

        return calculateMinPoint(
            point = tempPoint,
            moveCount = (moveCount - tempMoveCount) % 2,
            moveAmount = moveAmount
        )

    } else {
        //移動回数が偶数である場合
        if (moveCount % 2 == 0L) {
            return currentPoint.absoluteValue
            //移動回数が奇数である場合
        } else {
            val oddMoveCount = 1L
            return calculateMinPoint(
                point = currentPoint,
                moveCount = oddMoveCount,
                moveAmount = moveAmount
            )
        }
    }
}

//所与の条件から最小ポイントへ移動する
private fun calculateMinPoint(point: Long, moveCount: Long, moveAmount: Long): Long {
    return (point.absoluteValue - moveAmount * moveCount).absoluteValue
}

fun nextInt(): Int {
    return readLine()!!.toInt()
}

fun nextIntList(): List<Int> {
    return readLine()!!.split(" ").map { it.toInt() }
}

fun nextLongList(): List<Long> {
    return readLine()!!.split(" ").map { it.toLong() }
}

fun nextString(): String {
    return readLine()!!
}