func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   void Read(T &cn) {     char c;     int sig = 1;     while (!isdigit(c = getchar()))       if (c ==  - ) sig = -1;     cn = c - 48;     while (isdigit(c = getchar())) cn = cn * 10 + c - 48;     cn *= sig;   }   template <typename T>   void Write(T cn) {     if (cn < 0) {       putchar( - );       cn = 0 - cn;     }     int wei = 0;     T cm = 0;     int cx = cn % 10;     cn /= 10;     while (cn) wei++, cm = cm * 10 + cn % 10, cn /= 10;     while (wei--) putchar(cm % 10 + 48), cm /= 10;     putchar(cx + 48);   }   template <typename T>   void Max(T &cn, T cm) {     cn = cn < cm ? cm : cn;   }   template <typename T>   void Min(T &cn, T cm) {     cn = cn < cm ? cn : cm;   }   struct qwe {     long long v, c;     void getit() {       Read(v);       Read(c);     }     inline friend bool operator<(qwe a, qwe b) {       return a.v == b.v ? a.c > b.c : a.v < b.v;     }   };   struct xian {     long long k, b;     long long suan(long long cn) { return (cn - b + k - 1) / k; }     void mk(long long cn, long long cm) {       k = cn;       b = cm;     }   };   qwe a[200100 + 1];   int n;   long long m;   int xu[200100 + 1], xlen;   long long f[200100 + 1], g[200100 + 1];   xian zhan[200100 + 1];   int l, r;   int jiao_z(long long cn, xian A, xian B) {     return cn * (A.k - B.k) <= (B.b - A.b);   }   int jiao(xian A, xian B, xian C) {     double db1 = (B.b - A.b), db2 = (C.b - B.b);     double dk1 = (A.k - B.k), dk2 = (B.k - C.k);     return db1 * dk2 >= db2 * dk1;   }   long long qiu(int cn, int cm) {     while (l < r && jiao_z(zhan[l].suan(cn), zhan[l], zhan[l + 1])) l++;     if (l > r) return -10000000000000000;     return -zhan[l].suan(cn) * (cm - zhan[l].k) - cn + zhan[l].b;   }   void zeng(int ck, long long cb) {     xian lin;     lin.mk(ck, cb);     while (l < r && jiao(zhan[r - 1], zhan[r], lin)) r--;     zhan[++r] = lin;   }   int main() {     Read(n);     Read(m);     for (int i = 1; i <= n; i++) a[i].getit();     sort(a + 1, a + n + 1);     xlen = 0;     for (int i = 1; i <= n; i++) {       if (a[i].v <= 0) continue;       while (xlen && a[xu[xlen]].c > a[i].c) xlen--;       xu[++xlen] = i;     }     for (int i = 1; i <= xlen; i++) a[i] = a[xu[i]];     n = xlen;     f[0] = 0;     a[0].v = a[0].c = 0;     l = 1;     r = 0;     f[1] = 0;     zeng(a[1].v, f[1]);     long long ans = (m + a[1].v - 1) / a[1].v;     for (int i = 2; i <= n; i++) {       f[i] = qiu(a[i].c, a[i].v);       zeng(a[i].v, f[i]);       Min(ans, (m - f[i] + a[i].v - 1) / a[i].v);     }     Write(ans);     puts(  );     return 0;   }   