#include using namespace std; typedef pair P; struct node{ int t; int d; bool handle; }; set< P > use; set< P > locked; bool by_t(node a, node b){ return a.t < b.t; } bool by_d(node a, node b){ return a.d > b.d; } int main(void){ int n,k; cin >> n >> k; vector < node > task; for(int i = 0;i < n;++i){ int t,d; cin >> t >> d; node n = {t,d,true}; task.push_back(n); } sort(task.begin(),task.end(),by_d); for(int i = 0;i < (int)task.size();++i){ int t = task[i].t; set< P >::iterator upper = locked.upper_bound(P(t,0)); if(upper == locked.end() || !(upper->second < t)){ use.insert(P(t, t+k)); locked.insert(P(t+k,t-k)); task[i].handle = false; } } int res_max = 0; int res_sum = 0; for(int i = 0;i < (int)task.size();++i){ if(task[i].handle){ res_max = max(res_max, task[i].d); res_sum += task[i].d; } } cout << res_max << endl; cout << res_sum << endl; return 0; }