import sys



readline = sys.stdin.readline

MOD = 10 ** 9 + 7

INF = float('INF')

sys.setrecursionlimit(10 ** 5)





def main():

    x, k, d = list(map(int, readline().split()))

    cur = abs(x)

    rem = k

    cnt = min(cur // d, k)

    cur -= cnt * d

    rem -= cnt

    if rem % 2 == 0:

        ans = cur

    else:

        ans = abs(cur - d)



    print(ans)



if __name__ == '__main__':

    main()

x, k, d = list(map(int, input().split()))



cur = abs(x)  # 座標を正にしてしまいます

rem = k  # 残りの移動回数です



cnt = min(cur // d, k)  # 0に向かって移動する回数です

cur -= d * cnt

rem -= cnt



# 残り回数が0回の場合分けをする必要はないのですが、一応

if rem > 0:

    if rem % 2 == 1:

        cur = abs(cur - d)



print(cur)
import sys

readline = sys.stdin.readline
MOD = 10**9 + 7
INF = float("INF")
sys.setrecursionlimit(10**5)


def main():
    x, k, d = list(map(int, readline().split()))
    cur = abs(x)
    rem = k
    cnt = min(cur // d, k)
    cur -= cnt * d
    rem -= cnt
    if rem % 2 == 0:
        ans = cur
    else:
        ans = abs(cur - d)
    print(ans)


if __name__ == "__main__":
    main()

x, k, d = list(map(int, input().split()))
cur = abs(x)  # 座標を正にしてしまいます
rem = k  # 残りの移動回数です
cnt = min(cur // d, k)  # 0に向かって移動する回数です
cur -= d * cnt
rem -= cnt
# 残り回数が0回の場合分けをする必要はないのですが、一応
if rem > 0:
    if rem % 2 == 1:
        cur = abs(cur - d)
print(cur)

-import sys - -readline = sys.stdin.readline -MOD = 10**9 + 7 -INF = float("INF") -sys.setrecursionlimit(10**5) - - -def main(): -    x, k, d = list(map(int, readline().split())) -    cur = abs(x) -    rem = k -    cnt = min(cur // d, k) -    cur -= cnt * d -    rem -= cnt -    if rem % 2 == 0: -        ans = cur -    else: -        ans = abs(cur - d) -    print(ans) - - -if __name__ == "__main__": -    main() +x, k, d = list(map(int, input().split())) +cur = abs(x)  # 座標を正にしてしまいます +rem = k  # 残りの移動回数です +cnt = min(cur // d, k)  # 0に向かって移動する回数です +cur -= d * cnt +rem -= cnt +# 残り回数が0回の場合分けをする必要はないのですが、一応 +if rem > 0: +    if rem % 2 == 1: +        cur = abs(cur - d) +print(cur)