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

x = abs(x)
# 絶対値が最小になる場所
# つまり x から 0 に向かう
# 移動距離(dマス * k回) >= 0 以上であればそれが答え 
#  x - k*d  が答え
#  Python では問題ながい、型付の言語ではオーバフローを注意する必要あり
#  ストレートにやるといかになるが k*d がオーバフローするため式を変形させる
#  x - k*d = 0 -> x >= k*d -> x/k >= d -> d <= x/k
# if (x - k*d) >= 0:
if d <= x/k:
    print(x -k*d)
    exit()

# 1. そうでない場合は、一旦 0 に近いところまでの回数を計算する（つまり x/d回）
#    また、0に近い位置とは x/d のあまり（x%d）になる
# 2. 元の回数から1.の回数を引いた値が偶数の場合往復ができるため実質0
# 3. 2.と同様に奇数の場合 1. の位置から d を引いた絶対値が答えになる 
p = x%d
rem = k - x//d
if rem%2 == 0:
   print(p)
else:
    print(abs(p -d)) x, k, d = map(int, input().split()) x map(int, input().split()) map int input().split() ().split () input split k d x = abs(x) x abs(x) abs x if d <= x/k:
    print(x -k*d)
    exit()

# 1. そうでない場合は、一旦 0 に近いところまでの回数を計算する（つまり x/d回）
#    また、0に近い位置とは x/d のあまり（x%d）になる
# 2. 元の回数から1.の回数を引いた値が偶数の場合往復ができるため実質0
# 3. 2.と同様に奇数の場合 1. の位置から d を引いた絶対値が答えになる  d <= x/k d x/k x k print(x -k*d) print x -k*d x k*d k d exit() exit p = x%d p x%d x d rem = k - x//d rem k - x//d k x//d x d if rem%2 == 0:
   print(p)
else:
    print(abs(p -d)) rem%2 == 0 rem%2 rem 2 0 print(p) print p print(abs(p -d)) print abs(p -d) abs p -d p d d = map(int, input().split()) map(int, input().split()) d x, k, d = map(int, input().split()) map(int, input().split()) x k, d = map(int, input().split()) map(int, input().split()) k rem = k - x//d k - x//d rem p = x%d x%d p x = abs(x) abs(x) x
x, k, d = map(int, input().split())

x = abs(x)
# 絶対値が最小になる場所
# つまり x から 0 に向かう
# 移動距離(dマス * k回) >= 0 以上であればそれが答え 
#  x - k*d  が答え
#  Python では問題ながい、型付の言語ではオーバフローを注意する必要あり
#  ストレートにやるといかになるが k*d がオーバフローするため式を変形させる
#  x - k*d = 0 -> x >= k*d -> x/k >= d -> d <= x/k
# if (x - k*d) >= 0:
if d <= x/k:
    print(x -k*d)
    exit()

# 1. そうでない場合は、一旦 0 に近いところまでの回数を計算する（つまり x/d回）
#    また、0に近い位置とは x/d のあまり（x%d）になる
# 2. 元の回数から1.の回数を引いた値が偶数の場合往復ができるため実質0
# 3. 2.と同様に奇数の場合 1. の位置から d を引いた絶対値が答えになる 
p = x%d
rem = k - x//d
if rem%2 == 0:
   print(p)
else:
    print(abs(p -d))
