#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define int long long
#define fn for (int i = 0; i < n; i++)
#define fm for (int i = 0; i < m; i++)
#define all(v) v.begin(), v.end()
const int MOD = 1e9 + 7;
#define sort(a) sort(a.begin(), a.end())
#define vi vector<int> v
#define vvi vector<vector<int>>
#define vpi vector<pair<int, int>>
#define p(ans) cout << ans << endl;
#define yes cout << 'Y' << 'e' << 's' << endl;
#define no cout << 'N' << 'o' << endl;
#define inp(v) \
int x; \
cin >> x; \
v.push_back(x)
using namespace std;
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds; // find_by_order, order_of_key less-> increasing order greater->dreasing order
// *A.find_order_of(index)-> give element at that index
// A.order_of_key(x)->gives no of ele less than x (unique ele present) in case of inc set A.lower_bound(ele)->gives iterator of lb
class dsu
{
public:
vector<int> rank, parent, size;
dsu(int n)
{
rank.resize(n + 1, 0);
parent.resize(n + 1);
size.resize(n + 1, 1);
for (int i = 0; i <= n; i++)
parent[i] = i;
}
int find(int node)
{
if (node == parent[node])
return node;
return parent[node] = find(parent[node]);
}
void unionbysize(int u, int v)
{
int p1 = find(u);
int p2 = find(v);
if (p1 == p2)
return;
if (size[p1] < size[p2])
{
parent[p1] = p2;
size[p2] += size[p1];
}
else
{
parent[p2] = p1;
size[p1] += size[p2];
}
}
void unionbyrank(int u, int v)
{
int p1 = find(u);
int p2 = find(v);
if (p1 == p2)
return;
if (rank[p1] < rank[p2])
{
parent[p1] = p2;
}
else if (rank[p1] > rank[p2])
parent[p2] = p1;
else
{
parent[p1] = p2;
rank[p2]++;
}
}
};
class sgtree
{
public:
vector<int> segment;
sgtree(int n) { segment.resize(4 * n); }
void build(int ind, int s, int e, vector<int> &arr)
{
if (s == e)
{
segment[ind] = arr[e];
return;
}
int mid = (s + e) / 2;
build(2 * ind + 1, s, mid, arr);
build(2 * ind + 2, mid + 1, e, arr);
segment[ind] = min(segment[2 * ind + 1], segment[2 * ind + 2]);
}
int qry(int ind, int s, int e, int l, int r)
{
if (r < s || l > e)
return LLONG_MAX;
if (l <= s && r >= e)
return segment[ind];
int mid = (s + e) / 2;
return min(qry(2 * ind + 1, s, mid, l, r), qry(2 * ind + 2, mid + 1, e, l, r));
}
void update(int ind, int s, int e, int i, int val)
{
if (s == e)
{
segment[ind] = val;
return;
}
int mid = (s + e) / 2;
if (i <= mid)
update(2 * ind + 1, s, mid, i, val);
else
update(2 * ind + 2, mid + 1, e, i, val);
segment[ind] = min(segment[2 * ind + 1], segment[2 * ind + 2]);
}
};
bool p_check(int n)
{
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
int modExp(int base, int exp, int mod)
{
int result = 1;
base = base % mod;
while (exp > 0)
{
if (exp % 2 == 1)
{
result = (result * base) % mod;
}
base = (base * base) % mod;
exp /= 2;
}
return result;
}
int modInverse(int Q, int mod) { return modExp(Q, mod - 2, mod); }
int power(int a, int b)
{
if (b == 0)
return 1;
else if (b == 1)
return a;
int ans = power(a, b / 2);
if (b % 2 == 0)
return ans * ans;
else
return ans * ans * a;
}
int gcd(int a, int b)
{
if (a % b == 0)
return b;
return gcd(b, a % b);
}
int lcm(int a, int b)
{
int ans = (a * b) / (gcd(a, b));
return ans;
}
int quary(string &s)
{
cout << '?' << s << endl;
cout.flush();
int t;
cin >> t;
return t;
}
int countPrimesApprox(long long n)
{
if (n < 2)
return 0;
return static_cast<int>(n / log2l(n));
}
int32_t main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
int a = 1;
int ct = 0;
while (power(2, a) <= n)
{
int num1 = power(2, a);
int rem = n / num1;
int xx = sqrtl(rem);
ct += xx - xx / 2;
a++;
}
cout << ct << endl;
}