This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
typedef long long ll;
struct frac {
    ll p, q;
    frac(const ll &_p = 0, const ll &_q = 0): p(_p), q(_q) {
        if (q < 0) {
            p = -p;
            q = -q;
        }
    }
    bool operator<(const frac &f) const {
        return p * f.q < q * f.p;
    }
    bool operator>(const frac &f) const {
        return f < *this;
    }
    double dbl() const {
        return double(p) / q;
    }
} l;
struct point {
    ll x, y;
    point(const ll &x = 0, const ll &y = 0): x(x), y(y) {}
};
frac direction(const point &A, const point &B) {
    return frac(A.y - B.y, A.x - B.x);
}
const ll mxn = 1000005;
ll n, h, i, c = 1;
point L[mxn], R[mxn], a[mxn];
vector <point> H;
pair <frac, frac> inte[mxn >> 1];
int main() {
    scanf("%lld%lld", &n, &h);
    if (n == 3) {
        printf("0");
        return 0;
    }
    for (i = 0; i < n; i++) {
        scanf("%lld%lld", &a[i].x, &a[i].y);
    }
    H.resize(1, *a);
    for (i = 1; i < n; i++) {
        while (H.size() > 1 && direction(H.rbegin()[1], a[i]) < direction(H.back(), a[i])) H.pop_back();
        L[i] = H.back();
        H.push_back(a[i]);
    }
    H.resize(1, a[n - 1]);
    for (i = n - 2; i >= 0; i--) {
        while (H.size() > 1 && direction(H.rbegin()[1], a[i]) > direction(H.back(), a[i])) H.pop_back();
        R[i] = H.back();
        H.push_back(a[i]);
    }
    for (i = 2; i < n - 1; i += 2) {
        /*inte[i].first = {L[i].x * (L[i].y - a[i].y) + (h - L[i].y) * (L[i].x - a[i].x), L[i].y - a[i].y};
        inte[i].second = {a[i].x * (a[i].y - R[i].y) + (h - a[i].y) * (a[i].x - R[i].x), a[i].y - R[i].y};*/
        inte[i / 2 - 1] = {frac(a[i].x * (L[i].y - a[i].y) + (h - a[i].y) * (L[i].x - a[i].x), L[i].y - a[i].y),
            frac(a[i].x * (R[i].y - a[i].y) + (h - a[i].y) * (R[i].x - a[i].x), R[i].y - a[i].y)};
    }
    sort(inte, inte + n / 2 - 1, [](auto &a, auto &b) { return a.second < b.second; });
    /*for (i = 0; i + 1 < n >> 1; i++) {
        printf("[(%lld, %lld), (%lld, %lld)]\n", inte[i].first.p, inte[i].first.q, inte[i].second.p, inte[i].second.q);
    }*/
    l = inte[0].second;
    for (i = 1; i + 1 < n >> 1; i++) {
        if (l < inte[i].first) {
            l = inte[i].second;
            c++;
        }
    }
    printf("%lld", c);
    return 0;
}
Compilation message (stderr)
Main.cpp: In function 'int main()':
Main.cpp:38:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   38 |     scanf("%lld%lld", &n, &h);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~
Main.cpp:44:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   44 |         scanf("%lld%lld", &a[i].x, &a[i].y);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |