func_code_string: #include <bits/stdc++.h>   using namespace std;   struct single_node {     long long total;     long long prefix;     long long suffix;   };   vector<pair<long long, pair<int, int> > > v;   set<int> bounds;   long long a[300000 + 50];   long long d[300000 + 50];   long long c[300000 + 50];   long long lazy[1200000 + 50];   long long maxseg[1200000 + 50];   long long totseg[1200000 + 50];   long long maxpref[1200000 + 50];   long long maxsuff[1200000 + 50];   void build(int node, int l, int r) {     if (l == r) {       maxseg[node] = a[l];       maxpref[node] = a[l];       maxsuff[node] = a[l];       totseg[node] = a[l];       return;     }     int mid = (l + r) / 2;     build(2 * node + 1, l, mid);     build(2 * node + 2, mid + 1, r);     totseg[node] = totseg[2 * node + 1] + totseg[2 * node + 2];     maxseg[node] = max(maxsuff[2 * node + 1] + maxpref[2 * node + 2],                        max(maxseg[2 * node + 1], maxseg[2 * node + 2]));     maxpref[node] =         max(maxpref[2 * node + 1], totseg[2 * node + 1] + maxpref[2 * node + 2]);     maxsuff[node] =         max(maxsuff[2 * node + 2], totseg[2 * node + 2] + maxsuff[2 * node + 1]);     return;   }   single_node query(int node, int l, int r, int ql, int qr) {     if (l == r) {       if (ql <= l && qr >= r) {         single_node bc;         bc.total = totseg[node];         bc.prefix = maxpref[node];         bc.suffix = maxsuff[node];         return bc;       } else {         single_node bc;         bc.total = 0;         bc.prefix = 0;         bc.suffix = 0;         return bc;       }     }     if (ql <= l && qr >= r) {       single_node bc;       bc.total = totseg[node];       bc.prefix = maxpref[node];       bc.suffix = maxsuff[node];       return bc;     } else if (ql > r || qr < l) {       single_node bc;       bc.total = 0;       bc.prefix = 0;       bc.suffix = 0;       return bc;     }     int mid = (l + r) / 2;     single_node le = query(2 * node + 1, l, mid, ql, qr);     single_node ri = query(2 * node + 2, mid + 1, r, ql, qr);     single_node res;     res.total = le.total + ri.total;     res.prefix = max(le.prefix, le.total + ri.prefix);     res.suffix = max(ri.suffix, ri.total + le.suffix);     return res;   }   int main() {     ios::sync_with_stdio(false);     int n;     long long aa;     cin >> n >> aa;     long long ans = 0;     for (int i = 0; i < n; i++) {       cin >> d[i] >> c[i];       a[i] = aa - c[i];       ans = max(ans, a[i]);       if (i > 0) {         v.push_back(make_pair(d[i] - d[i - 1], make_pair(i - 1, i)));       }     }     build(0, 0, n - 1);     sort(v.begin(), v.end());     bounds.insert(0);     bounds.insert(n - 1);     for (int i = v.size() - 1; i >= 0; i--) {       int leend, ribeg;       leend = v[i].second.first;       ribeg = v[i].second.second;       set<int>::iterator iter1, iter2;       iter1 = bounds.lower_bound(ribeg);       iter2 = bounds.upper_bound(leend);       --iter2;       int lebeg, riend;       lebeg = (*iter2);       riend = (*iter1);       ans = max(ans, query(0, 0, n - 1, lebeg, leend).suffix +                          query(0, 0, n - 1, ribeg, riend).prefix -                          (v[i].first * v[i].first));       bounds.insert(leend);       bounds.insert(ribeg);     }     cout << ans;     return 0;   }   