import sys
read = sys.stdin.read
readlines = sys.stdin.readlines
def main():
    x, k, d = map(int, input().split())
    cycle = abs(x) // d     # cycle:距離ｘを距離ｄ移動で詰めるための必要移動回数。
    if cycle >= k:          # xまでの移動でｋが尽きる場合。
        print(abs(abs(x) - k * d))
    else:                   # xまで移動してｋが余る場合。
        k -= cycle          # ｋ＝余る移動回数、にする
        if k&1:             # kが奇数なら「ｘを飛び越えた地点」に留まるのが最適解。
            print(abs(abs(x) - (cycle + 1) * d))
        else:
            print(abs(abs(x) - (cycle) * d))

if __name__ == '__main__':
    main() import sys sys read = sys.stdin.read read sys.stdin.read sys.stdin sys stdin read readlines = sys.stdin.readlines readlines sys.stdin.readlines sys.stdin sys stdin readlines def main():
    x, k, d = map(int, input().split())
    cycle = abs(x) // d     # cycle:距離ｘを距離ｄ移動で詰めるための必要移動回数。
    if cycle >= k:          # xまでの移動でｋが尽きる場合。
        print(abs(abs(x) - k * d))
    else:                   # xまで移動してｋが余る場合。
        k -= cycle          # ｋ＝余る移動回数、にする
        if k&1:             # kが奇数なら「ｘを飛び越えた地点」に留まるのが最適解。
            print(abs(abs(x) - (cycle + 1) * d))
        else:
            print(abs(abs(x) - (cycle) * d)) main x, k, d = map(int, input().split()) x map(int, input().split()) map int input().split() ().split () input split k d cycle = abs(x) // d cycle abs(x) // d abs(x) abs x d if cycle >= k:          # xまでの移動でｋが尽きる場合。
        print(abs(abs(x) - k * d))
    else:                   # xまで移動してｋが余る場合。
        k -= cycle          # ｋ＝余る移動回数、にする
        if k&1:             # kが奇数なら「ｘを飛び越えた地点」に留まるのが最適解。
            print(abs(abs(x) - (cycle + 1) * d))
        else:
            print(abs(abs(x) - (cycle) * d)) cycle >= k cycle k print(abs(abs(x) - k * d)) print abs(abs(x) - k * d) abs abs(x) - k * d abs(x) abs x k * d k d k -= cycle k cycle if k&1:             # kが奇数なら「ｘを飛び越えた地点」に留まるのが最適解。
            print(abs(abs(x) - (cycle + 1) * d))
        else:
            print(abs(abs(x) - (cycle) * d)) k&1 k 1 print(abs(abs(x) - (cycle + 1) * d)) print abs(abs(x) - (cycle + 1) * d) abs abs(x) - (cycle + 1) * d abs(x) abs x (cycle + 1) * d cycle + 1 cycle 1 d print(abs(abs(x) - (cycle) * d)) print abs(abs(x) - (cycle) * d) abs abs(x) - (cycle) * d abs(x) abs x (cycle) * d cycle d if __name__ == '__main__':
    main() __name__ == '__main__' __name__ '__main__' main() main readlines = sys.stdin.readlines sys.stdin.readlines readlines def main():
    x, k, d = map(int, input().split())
    cycle = abs(x) // d     # cycle:距離ｘを距離ｄ移動で詰めるための必要移動回数。
    if cycle >= k:          # xまでの移動でｋが尽きる場合。
        print(abs(abs(x) - k * d))
    else:                   # xまで移動してｋが余る場合。
        k -= cycle          # ｋ＝余る移動回数、にする
        if k&1:             # kが奇数なら「ｘを飛び越えた地点」に留まるのが最適解。
            print(abs(abs(x) - (cycle + 1) * d))
        else:
            print(abs(abs(x) - (cycle) * d)) def main():
    x, k, d = map(int, input().split())
    cycle = abs(x) // d     # cycle:距離ｘを距離ｄ移動で詰めるための必要移動回数。
    if cycle >= k:          # xまでの移動でｋが尽きる場合。
        print(abs(abs(x) - k * d))
    else:                   # xまで移動してｋが余る場合。
        k -= cycle          # ｋ＝余る移動回数、にする
        if k&1:             # kが奇数なら「ｘを飛び越えた地点」に留まるのが最適解。
            print(abs(abs(x) - (cycle + 1) * d))
        else:
            print(abs(abs(x) - (cycle) * d)) main read = sys.stdin.read sys.stdin.read read
import sys
read = sys.stdin.read
readlines = sys.stdin.readlines
def main():
    x, k, d = map(int, input().split())
    cycle = abs(x) // d     # cycle:距離ｘを距離ｄ移動で詰めるための必要移動回数。
    if cycle >= k:          # xまでの移動でｋが尽きる場合。
        print(abs(abs(x) - k * d))
    else:                   # xまで移動してｋが余る場合。
        k -= cycle          # ｋ＝余る移動回数、にする
        if k&1:             # kが奇数なら「ｘを飛び越えた地点」に留まるのが最適解。
            print(abs(abs(x) - (cycle + 1) * d))
        else:
            print(abs(abs(x) - (cycle) * d))

if __name__ == '__main__':
    main()