/* * じょえチャンネル * 高評価・チャンネル登録よろしくおねがいします! * https://www.youtube.com/channel/UCRXsI3FL_kvaVL9zoolBfbQ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#pragma GCC target("avx2") //#pragma GCC optimize("O3") //#pragma GCC optimize("unroll-loops") //here!!! // define int long long !!!!! #define int long long // define int long long !!!!! #define mod (int)((1e9) + 7) //constexpr int mod = 998244353ll; #ifdef int #define inf (int)(3e18) #else #define inf (int)(5e8) #endif #define intt long long #define itn long long #define P pair #define rep(i, n) for (int i = 0; i < n; i++) #define REP(i, n) for (int i = 1; i <= n; i++) #define rev_rep(i, n) for (int i = n - 1; i >= 0; i--) #define REV_REP(i, n) for (int i = n; i >= 1; i--) #define ALL(v) v.begin(), v.end() #define smallpriority_queue(x) priority_queue, greater> using namespace std; //Library //モッドパウ inline int modpow(int x, int y, int m = mod) { int res = 1; while (y) { if (y & 1) { res *= x; res %= m; } x = x * x % m; y /= 2; } return res; } int mypow(int x, int y) { int res = 1; while (y) { if (y % 2) { res *= x; } x = x * x; y /= 2; } return res; } //is the number (x) a prime number? bool prime(int x) { if (!x || x == 1) { return false; } for (int i = 2; i * i <= x; i++) { if (!(x % i)) { return false; } } return true; } //saidai-kouyakusuu inline int gcd(int x, int y) { if (!y) { return x; } return gcd(y, x % y); } //number of keta int keta(int x) { int ans = 0; while (x) { x /= 10; ans++; } return ans; } //sum of keta int ketasum(int x) { int ans = 0; while (x) { ans += x % 10; x /= 10; } return ans; } inline int lcm(int x, int y) { int ans = x / gcd(x, y) * y; return ans; } int twobeki(int x) { int ans = 0; while (1) { if (!(x & 1)) { ans++; x >>= 1; } else { break; } } return ans; } template inline bool chmax(T &lhs, const U &rhs) { if (lhs < rhs) { lhs = rhs; return 1; } return 0; } template inline bool chmin(T &lhs, const U &rhs) { if (lhs > rhs) { lhs = rhs; return 1; } return 0; } void Yes() { cout << "Yes" << endl; } void No() { cout << "No" << endl; } void YES() { cout << "YES" << endl; } void NO() { cout << "NO" << endl; } #define fin(i) scanf("%lld", &i) #define fout(i) printf("%lld", i) #define fendl printf("\n") int kai(int x, int y) { int res = 1; for (int i = x - y + 1; i <= x; i++) { res *= i; res %= mod; } return res; } int comb(int x, int y) { if (y > x) return 0; // cout< class SegTree { int n; vector node; T def; function operation; function update; public: SegTree(unsigned int _n, T _def, function _operation, function _update) : def(_def), operation(_operation), update(_update) { n = 1; while (n < _n) { n *= 2; } node = vector(n * 2, def); } SegTree(vector &initvec, function _operation, function _update) : operation(_operation), update(_update) { n = 1; while (n < initvec.size()) { n *= 2; } node = vector(n * 2, def); for (int i = n; i < n + initvec.size(); i++) { node[i] = initvec[i - n]; } for (int i = n - 1; i >= 1; i--) { node[i] = operation(node[i * 2], node[i * 2 + 1]); } } void change(int i, T x) { i += n; node[i] = update(node[i], x); while (i >= 1) { i >>= 1; node[i] = operation(node[i * 2], node[i * 2 + 1]); } } T query(int l, int r) { l += n; r += n; T rx = def, lx = def; while (l < r) { if (l & 1) { lx = operation(lx, node[l]); l++; } if (r & 1) { r--; rx = operation(node[r], rx); } l >>= 1; r >>= 1; } return operation(lx, rx); } T operator[](const int &x) { return node[x + n]; } void fill(T x) { std::fill(ALL(node), x); } void print() { rep(i, n) std::cout << operator[](i) << " "; std::cout << std::endl; } }; class Union_Find { vector par; vector rankmy; vector ookisa; public: Union_Find(int size) { par = vector(size); rankmy = vector(size); ookisa = vector(size); for (int i = 0; i < size; i++) { par[i] = i; ookisa[i] = 1; } } int find(int x) { if (par[x] == x) { return x; } return par[x] = find(par[x]); } void unite(int x, int y) { x = find(x); y = find(y); if (x == y) { return; } if (rankmy[x] < rankmy[y]) { par[x] = y; ookisa[y] += ookisa[x]; ookisa[x] = 0; } else { par[y] = x; ookisa[x] += ookisa[y]; ookisa[y] = 0; if (rankmy[x] == rankmy[y]) { rankmy[x]++; } } } int size(int i) { i = find(i); return ookisa[i]; } bool same(int x, int y) { return find(x) == find(y); } }; class BIT { vector data; int size = 0; public: BIT(int _size) { data = vector(_size + 1); size = _size; } void add(int i, int x) { while (i <= size) { data[i] += x; i += i & -i; } } int sum(int i) { assert(i <= size); int s = 0; while (i > 0) { s += data[i]; i -= i & -i; } return s; } int lower_bound(int x) { if (x <= 0) { return 0; } else { int i = 0; int r = 1; while (r < size) r = r << 1; for (int len = r; len > 0; len = len >> 1) { if (i + len < size && data[i + len] < x) { x -= data[i + len]; i += len; } } return i + 1; } } }; //Union-Find-End int perm[2000005]; void init_perm() { perm[0] = 1; REP(i, 2000004) { perm[i] = perm[i - 1] * i % mod; } } int nCk(int x, int y) { if (y > x) { return 0; } if (x < 0) { return 0; } return perm[x] * modpow(perm[x - y], mod - 2) % mod * modpow(perm[y], mod - 2) % mod; } double kyori(pair f, pair s) { double ans = 0; double t = fabs(f.first - s.first); double y = fabs(f.second - s.second); ans = sqrt(t * t + y * y); return ans; } inline string stringmax(string &x, string &y) { if (x.size() > y.size()) { return x; } if (x.size() < y.size()) { return y; } rep(i, x.size()) { if (x[i] > y[i]) { return x; } if (x[i] < y[i]) { return y; } } return x; } vector RollingHash(string &s, string &t) { vector ans; __int128 h = 0, hamod = 0, ki = 0, kim = 0, hikaku = 0, one = 0; one = 1; ki = 1000000007ll; hamod = (one << 61) - 1; kim = 1; rep(i, t.size()) { hikaku *= ki; h *= ki; kim *= ki; hikaku += t[i]; h += s[i]; hikaku %= hamod; h %= hamod; kim %= hamod; } rep(i, (int)s.size() - (int)t.size() + 1) { if (h == hikaku) { ans.emplace_back(i); } h *= ki; h %= hamod; h += s[i + (int)t.size()]; h %= hamod; h += hamod; h -= s[i] * kim % hamod; h %= hamod; } return ans; } struct edge { int to; int length; edge(int _to, int _length) { to = _to; length = _length; } }; vector djkstra(vector> &road, int start) { vector kyo(road.size(), inf); smallpriority_queue(P) q; q.push({0, start}); kyo[start] = 0; while (q.size()) { int x = q.top().second; itn now = q.top().first; q.pop(); if (kyo[x] < now) { continue; } for (auto &i : road[x]) { if (kyo[i.to] > now + i.length) { kyo[i.to] = now + i.length; q.push({kyo[i.to], i.to}); } } } return kyo; } bool bubunmojiretsu(string& s,string& t){ int now=0; rep(i,(int)s.size()){ if (s[i]==t[now]) { now++; } if (now==(int)t.size()) { return 1; } } return 0; } template void change_to_unique(vector &v){ std::sort(ALL(v)); auto k=unique(ALL(v)); if(k!=v.end()){ v.erase(k,v.end()); } } #define R_MIN ([](long long a, long long b) { return min(a, b); }) #define R_MAX ([](long long a, long long b) { return max(a, b); }) #define R_SUM ([](long long a, long long b) { return a + b; }) #define NORMAL_UPDATE ([](long long a, long long b) { return b; }) #define ADD_UPDATE ([](long long a, long long b) { return a + b; }) #define MINUS_UPDATE ([](long long a, long long b) { return a - b; } #define endl "\n" //interactive の時に注意!!! #define Endl "\n" //interactive の時に注意!!! #define printd cout << fixed << setprecision(10) #define rrep(i, f, s) for (int i = f; i < s; i++) #define RREP(i, f, s) for (int i = f; i <= s; i++) #define rev_rrep(i, f, s) for (int i = s - 1; i >= f; i--) #define REV_RREP(i, f, s) for (int i = s; i >= f; i--) /*-----------------------Library Zone!-----------------------*/ int n,ans; signed main() { ios::sync_with_stdio(false); std::cin.tie(nullptr); cin>>n; cout<<(n+1)/2<