#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ull = unsigned long long;
using ld = long double;

#define          pb                push_back
#define          eb                emplace_back
#define          all(x)            x.begin(), x.end()
#define          sz(x)             int(x.size())
#define          pii               pair<int, int>
#define          pll               pair<ll, ll>
#define          ff                first
#define          ss                second

const ll INF = 1e18;
const int MOD = 1e9+7;
const int MX = 2e5+7;
const double PI = 3.1415926535897932384626;

ll bpow(ll a, ll b) {
    ll res = 1;
    while (b) {
        if (b & 1)
            res *= a;
        a *= a;
        b >>= 1;
    }
    return res;
}

void solve() {
    ll N; cin >> N;
    ll ans = LLONG_MAX;
    ll calc = 0, a = 0, c = 0;
    for (ll b = 0; b <= 60; b++) {
        calc = 1LL << b;
        a = N/calc;
        c = N-(a*calc);
        ans = min(ans, a+b+c);
    }
    cout << ans;
}

void fastIO(string name = "") {
    cin.tie(0)->sync_with_stdio(0);
    if (sz(name)) {
        freopen((name + ".in").c_str(), "r", stdin);
        freopen((name + ".out").c_str(), "w", stdout);
    }
}

int main() {
    fastIO("");

    int tc = 1; //cin >> tc;
    while (tc--) solve();
    return 0;
}
#include <bits/stdc++.h>
#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define ll long long
#define INF 999999999
#define MOD 1000000007
#define fore(i,a) for(auto &i:a)
#define all(x) (x).begin(),(x).end()
using namespace std;
long long modPow(long long x, long long a) {
  if (a == 1) return x;
  if (a % 2) return (x * modPow(x, a - 1)) % MOD;
  long long t = modPow(x, a / 2);
  return (t * t) % MOD;
}
long long modInv(long long x) {
  return modPow(x, MOD - 2);
  }
  void recursive_comb(int *indexes, int s, int rest, std::function<void(int *)> f) {
  if (rest == 0) {
    f(indexes);
  } else {
    if (s < 0) return;
    recursive_comb(indexes, s - 1, rest, f);
    indexes[rest - 1] = s;
    recursive_comb(indexes, s - 1, rest - 1, f);
  }
}

// nCkの組み合わせに対して処理を実行する
void foreach_comb(int n, int k, std::function<void(int *)> f) {
  int indexes[k];
  recursive_comb(indexes, n - 1, k, f);
}

// nPnの順列に対して処理を実行する
void foreach_permutation(int n, std::function<void(int *)> f) {
  int indexes[n];
  for (int i = 0; i < n; i++) indexes[i] = i;
  do {
    f(indexes);
  } while (std::next_permutation(indexes, indexes + n));
}

// nPkの順列に対して処理を実行する
void foreach_permutation(int n, int k, std::function<void(int *)> f) {
  foreach_comb(n, k, [&](int *c_indexes) {
    foreach_permutation(k, [&](int *p_indexes) {
      int indexes[k];
      for (int i = 0; i < k; i++) {
        indexes[i] = c_indexes[p_indexes[i]];
      }
      f(indexes);
    });
  });
}
int main() {
  ll n,q,a,b,c,ans;
  q = 1;
  b = 0; 
  cin >> n;
  ans = n;
  while (n >q)
  {
    a = n/q;
    c = n%q;
    if(a+b+c < ans ){
      ans = a+b+c;
    }
    q *= 2;
    b++;
  }

  cout << ans << endl;
}