import sys def h(n, v): if n == 0: return 0 m = n - 1 memo = {} def dfs(d, fx, fy): if d == -1: return 1 st = (d, fx, fy) if st in memo: return memo[st] res = 0 bm = (m >> d) & 1 bv = (v >> d) & 1 for bx in (0, 1): for by in (0, 1): if fx == 0 and bx > bm: continue if fy == 0 and by > bm: continue ok = 0 if d & 1: if (bx | by) == bv: ok = 1 else: if (bx & by) == bv: ok = 1 if ok: res += dfs(d-1, fx or (bx < bm), fy or (by < bm)) memo[st] = res return res return dfs(30, 0, 0) def g(x): freq = [(h(x, v), -v) for v in a] return -max(freq)[1] n = int(input()) a = [2 * (4**d - 1) // 3 for d in range(31)] ans = 0 p = 1 for k in range(1, 31): l = p r = n + 1 while r - l > 1: m = l + r >> 1 if g(m) < a[k]: l = m else: r = m ans += (r - p) * a[k-1] p = r print(ans)