#include #include #include #include #include #include #include #include #include #include #include #include #include #define _repargs(_1,_2,_3,name,...) name #define _rep(i,n) repi(i,0,n) #define repi(i,a,b) for(int i=(int)(a);i<(int)(b);++i) #define rep(...) _repargs(__VA_ARGS__,repi,_rep,)(__VA_ARGS__) #define all(x) (x).begin(),(x).end() #define mod 1000000007 #define inf 2000000007 #define mp make_pair #define pb push_back typedef long long ll; using namespace std; template inline void output(T a, int p = 0) { if(p) cout << fixed << setprecision(p) << a << "\n"; else cout << a << "\n"; } // end of template ll K; vector> A; bool ok(ll N){ vector T; rep(i, A.size()){ if(A[i].second >= N){ T.pb(A[i].first); } } ll cur = -inf; rep(i, T.size()){ if(T[i] - cur >= K){ cur = T[i]; } else return false; } return true; } int main() { cin.tie(0); ios::sync_with_stdio(0); // source code int N; cin >> N >> K; A.resize(N); ll r = 0; ll sum_all = 0; rep(i, N) cin >> A[i].first >> A[i].second, r = max(r, A[i].second), sum_all += A[i].second; ll l = -1; while(l + 1 < r){ ll mid = (l + r) / 2; if(ok(mid)){ r = mid; } else l = mid; } // rep(i, 4, 8){ // cout << i << ":" << ok(i) << endl; // } int ind = 0; ll ind_max = 0; ll sum = 0; ll ret = 0; vector T; // r以上の時刻 (T, T + 2K)の間はyukiさんは仕事ができない rep(i, A.size()){ if(A[i].second >= r){ T.pb(A[i].first - K); sum += A[i].second; } else{ ret = max(ret, A[i].second); } } output(ret); vector> B; // コストr未満でyukiさんが仕事ができる可能性のあるセル B.pb(mp(-inf, 0)); int cur = 0; if(T.size()){ rep(i, A.size()){ while(T[cur] + 2 * K < A[i].first && cur < T.size() - 1) cur++; if(A[i].second <= ret && (A[i].first <= T[cur] || T[cur] + 2 * K <= A[i].first)) B.pb(A[i]); } } vector dp(B.size()); rep(i, B.size()){ int ind_tmp = ind; while(B[i].first - B[ind_tmp].first >= K){ if(dp[ind_tmp] > ind_max){ ind_max = dp[ind_tmp]; ind = ind_tmp; } ind_tmp++; } dp[i] = dp[ind] + B[i].second; } ll m = 0; rep(i, dp.size()) m = max(m, dp[i]); sum += m; output(sum_all - sum); return 0; }