/* -*- coding: utf-8 -*- * * 448-1.cc: No.448 ゆきこーだーの雨と雪 (3) - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 200000; const int MAX_T = 1000000000; const int MAX_D = 1000000000; const int TINF = MAX_T * 2 + 10; typedef long long ll; const ll LINF = 1LL << 62; /* typedef */ /* global variables */ int ts[MAX_N + 1], ds[MAX_N + 1]; ll dsums[MAX_N + 1], dp[MAX_N + 1]; /* subroutines */ ll check(int n, int k, int maxd) { fill(dp, dp + n + 1, LINF); dp[0] = 0; for (int i = 0, j = 0, pi = -1; i < n; i++) { while (ts[j] < ts[i] + k) { if (ds[j] > maxd) pi = j; j++; } if (ds[i] <= maxd) { ll d0 = dp[i] + ds[i]; if (dp[i + 1] > d0) dp[i + 1] = d0; } if (pi <= i) { ll d1 = dp[i] + dsums[j] - dsums[i + 1]; if (dp[j] > d1) dp[j] = d1; } } return dp[n]; } /* main */ int main() { int n, k; scanf("%d%d", &n, &k); dsums[0] = 0; for (int i = 0; i < n; i++) { scanf("%d%d", ts + i, ds + i); dsums[i + 1] = dsums[i] + ds[i]; } ts[n] = TINF, ds[n] = 0; int dl = -1, dr = MAX_D; while (dl + 1 < dr) { int d = (dl + dr) / 2; if (check(n, k, d) >= LINF) dl = d; else dr = d; } printf("%d\n%lld\n", dr, check(n, k, dr)); return 0; }