func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long MAXN = 300005;   const long long INF = 0x3f3f3f3f3f3f3f3f;   long long n;   long long Read() {     long long x = 0, f = 1;     char c = getchar();     while (c >  9  || c <  0 ) {       if (c ==  - ) f = -1;       c = getchar();     }     while (c >=  0  && c <=  9 ) {       x = (x * 10) + (c ^ 48);       c = getchar();     }     return x * f;   }   void Put1(long long x) {     if (x > 9) Put1(x / 10);     putchar(x % 10 ^ 48);   }   void Put(long long x, char c = -1) {     if (x < 0) putchar( - ), x = -x;     Put1(x);     if (c >= 0) putchar(c);   }   template <typename T>   T Max(T x, T y) {     return x > y ? x : y;   }   template <typename T>   T Min(T x, T y) {     return x < y ? x : y;   }   template <typename T>   T Abs(T x) {     return x < 0 ? -x : x;   }   long long a, d[MAXN], c[MAXN], f[MAXN];   struct node {     long long d, maxf, maxans;     node() {}     node(long long d1, long long maxf1, long long maxans1) {       d = d1;       maxf = maxf1;       maxans = maxans1;     }   } sta[MAXN];   long long pow2(long long x) { return x * x; }   void solve() {     long long ans = Max(0ll, a - (c[n] - c[n - 1])), max_pref, ed = 0;     sta[0].maxans = -INF;     sta[++ed] = node(0, f[n], f[n]);     for (long long l = n - 1; l >= 1; --l) {       max_pref = -INF;       while (ed > 0 && sta[ed].d <= d[l + 1] - d[l]) {         max_pref = Max(max_pref, sta[ed].maxf);         sta[ed--] = node(0, 0, 0);       }       if (max_pref != -INF)         sta[++ed] =             node(d[l + 1] - d[l], max_pref,                  Max(max_pref - pow2(d[l + 1] - d[l]), sta[ed - 1].maxans));       sta[++ed] = node(0, f[l], Max(f[l], sta[ed - 1].maxans));       ans = Max(ans, sta[ed].maxans - f[l - 1]);     }     Put(ans,   n );   }   signed main() {     n = Read(), a = Read();     for (long long i = 1; i <= n; ++i)       d[i] = Read(), c[i] = c[i - 1] + Read(), f[i] = a * i - c[i];     solve();     return 0;   }   