func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( O2,unroll-loops )   using namespace std;   const int inf = 1000000010;   const long long INF = 1000000000000001000LL;   const int mod = 1000000007;   const int MAXN = 100200, SQ = 320, NSQ = MAXN / SQ + 1;   int n, m, w, u, v, x, y, t, a, b, maxb;   int A[MAXN], B[MAXN], ans[MAXN], lazy[NSQ];   pair<long long, long long> X[MAXN];   vector<int> vec[MAXN];   struct CHT {     pair<long long, int> cht[SQ];     int L, R;     inline long long Inter(pair<long long, long long> x,                            pair<long long, long long> y) {       if (x.first == y.first) return (x <= y ? -INF : INF);       return (x.second - y.second) / (y.first - x.first) +              ((x.second - y.second) % (y.first - x.first) > 0);     }     inline void Add(int a) {       while (R && Inter(X[cht[R - 1].second], X[a]) <= cht[R - 1].first) R--;       if (!R)         cht[R++] = {-INF, a};       else         cht[R] = {Inter(X[cht[R - 1].second], X[a]), a}, R++;     }     inline pair<long long, long long> Get(long long x) {       while (L + 1 < R && cht[L + 1].first <= x) L++;       int i = cht[L].second;       return {X[i].first * x + X[i].second, i};     }   } cht[NSQ];   void Build(int id) {     int tl = id * SQ, tr = min(MAXN, tl + SQ);     cht[id].L = cht[id].R = 0;     for (int i = tl; i < tr; i++) {       X[i].second += lazy[id] * X[i].first;       cht[id].Add(i);     }     lazy[id] = 0;   }   void Add(int l, int r, int val) {     int idl = -1, idr = -1;     while (l < r && l % SQ) idl = l / SQ, X[l].second += val * l, l++;     while (l < r && r % SQ) idr = r / SQ, r--, X[r].second += val * r;     while (l < r) lazy[l / SQ] += val, l += SQ;     if (idl != -1) Build(idl);     if (idr != -1) Build(idr);   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     cin >> n >> w;     for (int i = 1; i <= n; i++) {       cin >> A[i] >> B[i];       vec[B[i]].push_back(i);       maxb = max(maxb, B[i]);     }     for (int i = 0; i < MAXN; i++) X[i].first = i;     for (int i = 0; i * SQ < MAXN; i++) Build(i);     int ted = n;     for (int i = 0; i <= maxb + 1; i++) {       pair<long long, long long> p = {-inf, -1};       for (int j = 0; j * SQ + SQ <= MAXN; j++) p = max(p, cht[j].Get(lazy[j]));       cout << p.first + 1ll * ted * i * w <<     << p.second <<   n ;       for (int j : vec[i]) Add(0, A[j] + 1, +1), ted--;     }     return 0;   }   