#include "bits/stdc++.h" using namespace std; #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) #define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) #define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i)) static const int INF = 0x3f3f3f3f; static const long long INFL = 0x3f3f3f3f3f3f3f3fLL; typedef vector vi; typedef pair pii; typedef vector > vpii; typedef long long ll; template static void amin(T &x, U y) { if(y < x) x = y; } template static void amax(T &x, U y) { if(x < y) x = y; } int main() { int N; int K; while(~scanf("%d%d", &N, &K)) { vi time(N), diff(N); vpii dts(N); rep(i, N) { int T; int D; scanf("%d%d", &T, &D); time[i] = T; diff[i] = D; dts[i] = { D, T }; } sort(dts.rbegin(), dts.rend()); int maxD = -INF; { set s; for(auto p : dts) { auto it = s.insert(p.second).first; ++ it; bool ok = true; if(it != s.end()) ok &= abs(p.second - *it) >= K; -- it; if(it != s.begin()) { -- it; ok &= abs(p.second - *it) >= K; } if(!ok) { maxD = p.first; break; } } } if(maxD == -INF) { puts("0\n0"); continue; } vector ngcnt(N + 1); vector sum(N + 1); rep(i, N) { sum[i + 1] = sum[i] + diff[i]; ngcnt[i + 1] = ngcnt[i] + (diff[i] > maxD); } vector dp(N + 1, INFL); dp[0] = 0; rep(i, N) { ll x = INFL; int j = (upper_bound(time.begin(), time.end(), time[i] - K) - time.begin()); if(ngcnt[i] - ngcnt[j] == 0) amin(x, dp[j] + (sum[i] - sum[j])); if(diff[i] <= maxD) amin(x, dp[i] + diff[i]); dp[i + 1] = x; } ll ans = dp[N]; printf("%d\n%lld\n", maxD, ans); } return 0; }