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 current = ln[0]
    val moveCount = ln[1]
    val moveAmount = ln[2]


    //移動する必要がある
    if (current.absoluteValue > moveAmount) {
        //実際に移動する回数
        //moveAmountを超える回数まで移動したあとは偶数か奇数かで移動回数が決まる。0回か1回
        //moveAmountを超える回数までの移動回数は？　→　
        val actualMoveCount = if(current.absoluteValue / moveAmount > moveCount) moveCount else current.absoluteValue / moveAmount

        val temp = min(
            (current - moveAmount * actualMoveCount).absoluteValue,
            (current + moveAmount * actualMoveCount).absoluteValue
        )

        return min(
            (temp - (moveCount - actualMoveCount) % 2 * moveAmount).absoluteValue,
            (temp + (moveCount - actualMoveCount) % 2 * moveAmount).absoluteValue
        )

    } else {
        //移動回数が偶数である場合
        if (moveCount % 2 == 0L) {
            return current.absoluteValue
            //移動回数が奇数である場合
        } else {
            return min((current - moveAmount).absoluteValue, (current + moveAmount).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()!!
}