#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const double PI = acos(-1.0);
struct cinacc {
  cinacc() {
    cin.tie(0);
    ios::sync_with_stdio(false);
  }
} cinaccc;
struct coutacc {
  coutacc() {
    cout.setf(ios::fixed);
    cout.precision(12);
  }
} coutaccc;
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
T findVector(vector<T> v, int n) {
  auto it = find(v.begin(), v.end(), n);
  size_t i = distance(v.begin(), it);
  if (i == v.size()) return -1;
  return i;
}
bool isPrime(int n) {
  if (n < 2)
    return false;
  else if (n == 2)
    return true;
  else if (n % 2 == 0)
    return false;
  double sqrtNum = sqrt(n);
  for (int i = 3; i <= sqrtNum; i += 2)
    if (n % i == 0) return false;
  return true;
}
template <class T>
vector<T> sortVector(vector<T> v, bool b = true) {
  if (b)
    sort(v.begin(), v.end());
  else
    sort(v.begin(), v.end(), greater<T>());
  return v;
}
vector<complex<double>> fft(vector<complex<double>> a, bool inverse = false) {
  int n = a.size(), h = 0;
  for (int i = 0; 1 << i < n; i++) h++;
  for (int i = 0; i < (int)(n); i++) {
    int j = 0;
    for (int k = 0; k < (int)(h); k++) j |= (i >> k & 1) << (h - 1 - k);
    if (i < j) swap(a[i], a[j]);
  }
  for (int b = 1; b < n; b *= 2) {
    for (int j = 0; j < b; j++) {
      complex<double> w =
          polar(1.0, (2 * M_PI) / (2 * b) * j * (inverse ? 1 : -1));
      for (int k = 0; k < n; k += b * 2) {
        complex<double> s = a[j + k];
        complex<double> t = a[j + k + b] * w;
        a[j + k] = s + t;
        a[j + k + b] = s - t;
      }
    }
  }
  if (inverse)
    for (int i = 0; i < (int)(n); i++) a[i] /= n;
  return a;
}
vector<complex<double>> fft(vector<double> a, bool inverse = false) {
  vector<complex<double>> a_complex(a.size());
  for (int i = 0; i < (int)(a.size()); i++)
    a_complex[i] = complex<double>(a[i], 0);
  return fft(a_complex, inverse);
}
vector<double> convolve(vector<double> a, vector<double> b) {
  int s = a.size() + b.size() - 1, t = 1;
  while (t < s) t *= 2;
  a.resize(t);
  b.resize(t);
  vector<complex<double>> A = fft(a);
  vector<complex<double>> B = fft(b);
  for (int i = 0; i < (int)(t); i++) A[i] *= B[i];
  A = fft(A, true);
  a.resize(s);
  for (int i = 0; i < (int)(s); i++) a[i] = A[i].real();
  return a;
}
vector<unsigned long long> z_algorithm(string s) {
  vector<unsigned long long> a(s.length());
  a[0] = s.size();
  for (unsigned long long i = 1, j = 0, k; i < s.size();) {
    while (i + j < s.size() && s[j] == s[i + j]) ++j;
    a[i] = j;
    k = !!j;
    while (i + k < s.size() && k + a[k] < j) a[i + k] = a[k], ++k;
    i += k + !j;
    j -= k;
  }
  return a;
}
int main(void) {
  int n;
  cin >> n;
  if (n % 2 == 0)
    cout << n / 2;
  else
    cout << n / 2 + 1;
  return 0;
}
