#include <bits/stdc++.h>
#include <bitset>
#include <algorithm>
#define int long long
using namespace std;
#define mod 998244353
#define FAST                          \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL);
bool vis[3000005], vis1[3000005];
vector<int> vec[3000005], v1, vec1[3000005];
int child[2000005];
int divi[2000005];

// int dis[100005] = {0};
int h[100005];
int p[100005];
int dp[100005][100];
bool f = 0;
int bad[100005], good[100005];
int p5[100005];
void dfs(int node)
{
    vis[node] = 1;
    for (int i = 0; i < vec[node].size(); i++)
    {
        int t_good = 0, t_bad = 0;
        if (!vis[vec[node][i]])

            dfs(vec[node][i]);
    }
}

// int ans[200005];

// void fun(int a, int b, int c)
// {
//     //ll val = 1;

//     while (a <= b)
//     {
//         ans[a] += c;
//         int p = -a;
//         a += (a & p);
//     }
// }
// int find1(int a)
// {
//     int sum = 0;
//     while (a != 0)
//     {
//         sum += ans[a];
//         int p = -a;
//         a -= (a & p);
//     }
//     return sum;
// }

// int fastexpo(int a, int b)
// {
//     int ans = 1;
//     while (b)
//     {
//         if (b & 1)
//             ans = (ans * a) % mod;
//         b = b / 2;
//         a = (a * a) % mod;
//     }
//     return ans % mod;
// }

// struct fun1
// {
//     string s1;
//     fun1(string s1)
//         : s1(s1)
//     {
//     }
// };
// struct cmp
// {
//     bool operator()(const fun1 &a, const fun1 &b) const
//     {
//         string lena = a.s1 + b.s1;
//         string lenb = b.s1 + a.s1;
//         if (lena == lenb)
//             return a.s1 > b.s1;
//         return lena < lenb;
//     }
// };
// class MyClass
// {
//     int a;
//     void co()
//     {
//         cout << a << "\n";
//     }
//     //run();
// };
vector<int> prime;
void run()
{
    int j = 1;
    for (int i = 2; i < 100001; i++)
    {
        if (!vis1[i])
            while (i * j < 100001)
            {
                vis1[i * j] = 1;
                divi[i * j] = i;
                j++;
            }
        j = 1;
    }
    for (int i = 2; i < 100001; i++)
    {
        // cout << i << " " << divi[i] << "\n";
        if (i == divi[i])
            prime.push_back(i);
    }
    // for (int i = 1; i < 1000001; i++)
    // {
    //     map<int, int> mp;
    //     int p = i;
    //     while (p > 1)
    //     {
    //         mp[divi[p]]++;
    //         p /= divi[p];
    //     }
    //     for (auto itr : mp)
    //     {
    //         v2[i].push_back({itr.first, itr.second});
    //     }
    // }
}
// string getString(char x)
// {
//     string s(1, x);

//     return s;
// }
// struct stru
// {
//     int n;
//     int t;
//     struct stru *node;
//     /* data */
// } p1;

int dup[2000005];
int pre[2000005];
int dis(int x1, int y1, int x2, int y2)
{
    return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}
int32_t main()
{

    int x, k, d;
    cin >> x >> k >> d;
    swap(k, d);
    int a = (abs(x) / k);
    if (a >= d)
    {
        if (x < 0)
            cout << abs(x + d * k) << "\n";
        else
        {
            cout << abs(x - d * k) << "\n";
        }
    }
    else
    {
        int a1 = abs(x) % k;
        int a2 = abs(a1 - k);
        if ((d - a) % 2)
            cout << (a2) << "\n";
        else
        {
            cout << a1 << "\n";
        }
    }

    return 0;
}

Measured memory_bytes: 144216