int integerReplacement(long n, int d = 0) {
     return n == 1
         ? d
         : n % 2 == 0
             ? integerReplacement(n / 2, d + 1)
             : min(integerReplacement(n + 1, d + 1), integerReplacement(n - 1, d + 1));
 }
int integerReplacement(int n) {
    if (n == 2147483647) return 32; 
    if (n == 1) return 0;
    if (n % 2 == 0) return 1 + integerReplacement(n >> 1);//even
    int plusOne = 1 + integerReplacement(n + 1);
    int minusOne = 1 + integerReplacement(n - 1);
    return plusOne < minusOne ? plusOne : minusOne;
}
 int integerReplacement(int n) {
     if(n==INT_MAX)
         return 32;
     if(n==1)
         return 0;
     if(n%2==0)
         return 1 + integerReplacement(n/2);
     else
         return 1 + min(integerReplacement(n-1),integerReplacement(n+1));
 }
 int integerReplacement(long n) {
     if (n == 1)
         return 0;
         
     if (n % 2 == 0) {
         return 1 + integerReplacement(n / 2);
     } 
     else {
         int a = integerReplacement(n + 1);
         int b = integerReplacement(n - 1);
         return 1 + min(a, b);
     }
 }
 int integerReplacement(int n) {
     if(n == 1 || 0)
         return 0;
     if(n == 2)
         return 1;
     if(n % 2 == 0)
         return integerReplacement(n / 2) + 1;
     else{
         if(n == INT_MAX)
             return  min(integerReplacement(n - 1), integerReplacement(n / 2 + 1) + 1) + 1;
         return min(integerReplacement(n - 1), integerReplacement(n + 1)) + 1;
     }
 }
 int integerReplacement_recursionWithCache(int n) {
     static unordered_map<int, int> cache;
     //if hitted the cache, just return the result
     if (cache.find(n) != cache.end()) return cache[n];
     
     int result;
     if ( n <= 1) return 0; // recursive exited point
     if ( n == INT_MAX ) return 32; // special case to avoid integer overflow.
     if ( n % 2 == 0 ) result = integerReplacement(n/2) + 1;
     else result = min( integerReplacement(n+1), integerReplacement(n-1) ) + 1;
     
     //add into cache
     cache[n] = result;
     return result;
 }
 int integerReplacement(int n) 
 {
     if (n == 1)
         return res;
     if (n == 3)
     {
         res += 2;
         return res;
     }
     if (n == INT_MAX)
         return 32;
     
     res ++;
     if (n & 1)
         if ((n + 1) % 4 == 0)
             integerReplacement(n + 1);
         else
             integerReplacement(n - 1);
     else
         integerReplacement(n / 2);
         
     return res;
 }
 int integerReplacement_recursion(int n) {
     if ( n <= 1) return 0; // recursive exited point
     if ( n == INT_MAX ) return 32; // special case to avoid integer overflow.
     if ( n % 2 == 0 ) return integerReplacement(n/2) + 1;
     return min( integerReplacement(n+1), integerReplacement(n-1) ) + 1;
 }
 int integerReplacement(int n) {
     if (n == 1) return 0;
     if (n % 2 == 0) return integerReplacement(n / 2) + 1;
     if (n != INT_MAX) return min(integerReplacement(n + 1), integerReplacement(n - 1)) + 1;
     return min(integerReplacement(n - 1), integerReplacement(((n - 1) / 2 + 1) + 1)) + 1;
 }