#include #include #include #include #include using namespace std; using ll = long long; using S = pair; using P = pair; int n; ll k; vector

task; S calc(ll md) { multiset mi; vector dp(n, 0); ll la = -1, l = 0; mi.insert(0); for (int i = 0; i < n; i++) { ll t, d; tie(t, d) = task[i]; while (l < i && t-task[l].first >= k) { if (la <= l && dp[l] >= 0) mi.insert(dp[l]); l++; } if (!mi.size()) { if (md < d) return S(false, -1); dp[i] = -1; } else { dp[i] = (*mi.rbegin()) + d; } if (md < d) { // must use mi.clear(); la = i; } } return S(true, *mi.rbegin()); } int main() { cin >> n >> k; ll sm = 0; for (int i = 0; i < n; i++) { ll t, d; cin >> t >> d; task.push_back(P(t, d)); sm += d; } task.push_back(P(1LL<<50, 0)); n++; ll l = -1, r = (1LL<<40); while (r-l > 1) { ll md = (l+r)/2; if (!calc(md).first) { l = md; } else { r = md; } } auto s = calc(r); cout << r << endl << sm-s.second << endl; return 0; }