func_code_string: #include <bits/stdc++.h>   using namespace std;   struct DSU {     struct Node {       int pr;       long long max_sum;       long long max_pref;       long long sum;       long long max_suff;     };     vector<Node> t;     multiset<long long> mx;     DSU(int n, vector<int>& c) {       t.resize(n);       for (int i = 0; i < n; ++i) {         t[i].pr = i;         t[i].sum = c[i];         t[i].max_sum = max(0, c[i]);         t[i].max_pref = max(0, c[i]);         t[i].max_suff = max(0, c[i]);         mx.insert(t[i].max_sum);       }     }     int f(int v) {       if (t[v].pr != v) {         t[v].pr = f(t[v].pr);       }       return t[v].pr;     }     void merge(int x, int y) {       x = f(x);       y = f(y);       if (x == y) {         return;       }       t[x].pr = y;       mx.erase(mx.lower_bound(t[x].max_sum));       mx.erase(mx.lower_bound(t[y].max_sum));       Node new_node;       new_node.sum = t[x].sum + t[y].sum;       new_node.pr = y;       new_node.max_sum = max(t[y].max_sum, t[x].max_sum);       new_node.max_sum = max(new_node.max_sum, t[x].max_suff + t[y].max_pref);       new_node.max_pref = max(t[x].max_pref, t[x].sum + t[y].max_pref);       new_node.max_suff = max(t[y].max_suff, t[y].sum + t[x].max_suff);       new_node.max_sum = max(new_node.max_sum, 0LL);       new_node.max_pref = max(new_node.max_pref, 0LL);       new_node.max_suff = max(new_node.max_suff, 0LL);       t[y] = new_node;       mx.insert(t[y].max_sum);     }   };   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     int n;     long long m;     cin >> n >> m;     vector<int> d(n), c(n);     for (int i = 0; i < n; ++i) {       cin >> d[i] >> c[i];       c[i] = m - c[i];     }     set<pair<int, int> > q;     for (int i = 0; i + 1 < n; ++i) {       q.insert({d[i + 1] - d[i], i});     }     q.insert({-1, -1});     DSU t(n, c);     long long ans = 0;     while (q.size()) {       auto i = *q.begin();       q.erase(q.begin());       if (i.second != -1) {         t.merge(i.second, i.second + 1);         ans = max(ans, *--t.mx.end() - i.first * 1LL * i.first);       } else {         ans = max(ans, *--t.mx.end());       }     }     cout << ans <<   n ;   }   