Problem:
Score : 300 points

Problem Statement

Takahashi, who lives on the number line, is now at coordinate X. He will make exactly K moves of distance D in the positive or negative direction.

More specifically, in one move, he can go from coordinate x to x + D or x - D.

He wants to make K moves so that the absolute value of the coordinate of the destination will be the smallest possible.

Find the minimum possible absolute value of the coordinate of the destination.

Constraints

-10^{15} \leq X \leq 10^{15}

1 \leq K \leq 10^{15}

1 \leq D \leq 10^{15}

All values in input are integers.

Input

Input is given from Standard Input in the following format:

X K D

Output

Print the minimum possible absolute value of the coordinate of the destination.

Sample Input 1

6 2 4

Sample Output 1

2

Takahashi is now at coordinate 6. It is optimal to make the following moves:

Move from coordinate 6 to (6 - 4 =) 2.

Move from coordinate 2 to (2 - 4 =) -2.

Here, the absolute value of the coordinate of the destination is 2, and we cannot make it smaller.

Sample Input 2

7 4 3

Sample Output 2

1

Takahashi is now at coordinate 7. It is optimal to make, for example, the following moves:

Move from coordinate 7 to 4.

Move from coordinate 4 to 7.

Move from coordinate 7 to 4.

Move from coordinate 4 to 1.

Here, the absolute value of the coordinate of the destination is 1, and we cannot make it smaller.

Sample Input 3

10 1 2

Sample Output 3

8

Sample Input 4

1000000000000000 1000000000000000 1000000000000000

Sample Output 4

1000000000000000

The answer can be enormous.

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

 #include <bits/stdc++.h>

 using namespace std;
 
 #define inf ((1<<31)-1)
 #define inf64 ((1<<63)-1)
 #define odd(x) (x&1)
 #define pow2(x) (1<<x)
 #define log2bin(x) (32-__builtin_clz(x)-1)
 #define popcnt(x) __builtin_popcount(x)
 #define m7(x) (x%1000000007)
 #define swapi(x,y) x^=y;y^=x;x^=y
 #define forinc(var,from,to) for(auto var=from,To=to;var!=To;var++) // bisa untuk iter jg
 #define fordec(var,from,to) for(auto var=from,To=to;var!=To;var--)
 #define fors(var,s) for(int var=0;s[var];var++)
 #define ll long long
 #define rational tuple<bool,long long,long long>
 #define point pair<long long,long long>
 #define mpr make_pair
 #define mtp make_tuple
 #define pb emplace_back

 #define _tab '\t'
 #define $ <<_tab<<

 #define cinarr(A,len) for(int i=0;i<len;i++){cin>>A[i];}
 #define coutarr(A,len) for(int i=0;i<len;i++){cout<<A[i]<<' ';}cout<<endl
 #define coutin(V) for(auto& i : V){cout << i << ' ';}cout<<endl // for vect and set
 #define coutmap(U) for(auto& i : U){cout << i.first << "->" << i.second << ", ";}cout<<endl // for map

 // DEBUG
 #define deb(x) cout << #x << '\t' << x << endl

 // ==== fast function ====
 /*
 #define sortsec(T1,T2) [](const pair<T1,T2> &a,const pair<T1,T2> &b){ return a.second<b.second;}
 #define sortsecgreater(T1,T2) [](const pair<T1,T2> &a,const pair<T1,T2> &b){ return a.second>b.second;}
 */

/*========================================================================*/
/* strategi/note:



/================================*/



bool solved=0;
void solve(){solved=1;
    long long x,k,d;
    cin >> x >> k >> d;
    x=abs(x);k=abs(k);d=abs(d);
    if(x < k*d){
        // ada saatnya bolak-balik
        
        // menuju titik mulai bolak balik
        k -= x/d;
        x %= d;
        
        if(k&1){ // melebihi (negatif)
            cout << abs(x-d) << endl;
        }
        else{
            // sama (genap remaining moves) (bolak balik kan)
            cout << x << endl;
        }
        
    }
    else{
        // mendekat terus
        cout << x-k*d << endl;
    }

}

int main(){
     ios_base::sync_with_stdio(0);
     cin.tie(0);
     //cout<<fixed<<setprecision( ); // iomanip **

	solve();
//	int t;cin>>t;while(t--){solve();}

     if(!solved)cout<<"solve() function blm dipanggil!"<<endl;
	 //cout.flush(); cin.get();
     return 0;
}