#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define     bit_1(a)       __builtin_popcount(a)
#define     ull            unsigned long long
#define     ll             long long
#define     pb             push_back
#define     pf             push_front
#define     mpr            make_pair
#define     ins            insert
#define     ff             first
#define     ss             second
#define     vi             vector<int>
#define     vl             vector<ll>
#define     vstr           vector<string>
#define     si             set<int>
#define     sl             set<ll>
#define     li             list<int>
#define     pii            pair<int,int>
#define     pll            pair<ll,ll>
#define     mii            map<int,int>
#define     mll            map<ll,ll>
#define     ma             INT_MAX
#define     mi             INT_MIN
#define     mod            1000000007
#define     pi             3.14159265359
#define     e              2.71828182846
#define     inf            1000000000000000LL
#define     all(x)         x.begin(), x.end()
#define     lb(a,b,c)      lower_bound(a,a+b,c)-a
#define     ub(a,b,c)      upper_bound(a,a+b,c)-a
#define     lbv(a,c)       lower_bound(all(a),c)-a.begin()
#define     ubv(a,c)       upper_bound(all(a),c)-a.begin()
#define     srt1(a,b)      sort(a,a+b)
#define     srt2(a,b)      sort(a,a+b,greater<int>())
#define     gcd(a,b)       __gcd(a,b)
#define     lcm(a,b)       (a*(b/gcd(a,b)))
#define     harmonic(n)    0.57721566490153286l+log(n)
#define     mem(a, b)      memset(a, b, sizeof(a))
#define     orderset1      tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>
#define     orderset2      tree<int,null_type,greater<int>,rb_tree_tag,tree_order_statistics_node_update>

///s.lower_bound(a),s.upper_bound(a), for set
///nCr(x, y) = nCr(x-1, y-1) + nCr(x-1, y)
///factorial digit   ((n * log10(n / e) +log10(2 * pi * n) /2.0));
/// lcm(a,b)=a/gcd(a,b)*b (handle overflow)

bool sortinrev1(const pair<int,int>&a,const pair<int,int>&b)
{
    //return (a.first > b.first);
    if(a.first==b.first)return (a.second>b.second);
    else return (a.first > b.first);
}
bool sortinrev2(const pair<int,int>&a,const pair<int,int>&b)
{
    //return (a.first > b.first);
    if(a.first==b.first)return (a.second<b.second);
    else return (a.first > b.first);
}
int fx[]={1,-1,0,0};
int fy[]={0,0,1,-1};

bool flag[105][105][105];

int main()
{
    /*string str;
    cin>>str;
    int maxx=-1;
    for(int i=0;i<str.size();){
        if(str[i]=='R'){
            int cnt=0;
            while(str[i]=='R'){
                cnt++;
                i++;
                if(i==str.size())break;
            }
            maxx=max(cnt,maxx);
        }
        else i++;
    }
    if(maxx==-1)cout<<0<<endl;
    else
    cout<<maxx<<endl;*/
    /*int n,cnt=0;
    cin>>n;
    int L[n+5];
    for(int i=1;i<=n;i++)cin>>L[i];
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            for(int k=j+1;k<=n;k++){
                if(L[i]!=L[j]&&L[j]!=L[k]&&L[i]!=L[k]){
                    int maxx=max(L[i],max(L[j],L[k]));
                    if(maxx==L[i]&&L[i]<L[j]+L[k])cnt++;
                    else if(maxx==L[j]&&L[j]<L[i]+L[k])cnt++;
                    else if(maxx==L[k]&&L[k]<L[j]+L[i])cnt++;
                }
            }
        }
    }
    cout<<cnt<<endl;*/
    ll x,k,d;
    ll ans1=inf;
    ll ans2=inf;
    ll ans3=inf;
    ll ans4=inf;
    ll ans5=inf;
    ll ans6=inf;
    ll minn=inf;
    ll minn2=inf;
    cin>>x>>k>>d;
    x=abs(x);
    ll a=x/d;
    if(a>k){
        cout<<abs(x-(k*d))<<endl;
        return 0;
    }
    if(x%d!=0)a++;
    if(a>k){
        cout<<abs(x-(k*d))<<endl;
        return 0;
    }
    if(k-a>=0 && (k-a)%2==0)
        ans1=abs(x-(a*d));
    if(k-a>0 && (k-a)&1)
        ans2=abs(x-((a-1)*d));
    ll b=a-1;
    if(k-b>=0 && (k-b)%2==0)
        ans3=abs(x-(b*d));
    if(k-b>=0 && (k-b)&1)
        ans4=abs(x-((b-1)*d));
    ll c=a+1;
    if(k-c>=0 && (k-c)%2==0)
        ans5=abs(x-(c*d));
    if(k-c>=0 && (k-c)&1)
        ans6=abs(x-((c-1)*d));
    vl v;
    v.pb(ans1);
    v.pb(ans2);
    v.pb(ans3);
    v.pb(ans4);
    v.pb(ans5);
    v.pb(ans6);
    sort(all(v));
    cout<<v[0]<<endl;
}



Measured memory_bytes: 3628