void main(){ import std.stdio, std.string, std.conv, std.algorithm; int n, k; rd(n, k); auto t=new int[](n), d=new long[](n); foreach(i; 0..n) rd(t[i], d[i]); bool ch(long y){ // yよりむずいの全部解けるか for(int i=0, T=0; iy){ if(t[i]1){ auto md=(ok+ng)/2; ch(md) ? ok : ng = md; } long mx1=ok; if(mx1==0){writeln(0); writeln(0); return;} int[] idx; auto ame=new bool[](n); for(int i=0, T=0; imx1) T=t[i]+k; else if(t[i]=0; i--){ if(d[i]>mx1) T=t[i]-k; else if(t[i]>T) ame[i]=true; } foreach(int i; 0..n){ if(d[i]<=mx1 && ame[i]==false) idx~=i; } auto m=idx.length; auto rec=new long[](m); if(m==0){ writeln(mx1); writeln(reduce!((r, e)=>r+((e<=mx1)?e:0L))(0L, d)); return; } rec[0]=d[idx[0]]; for(int i=1, j=0; ir+((e>mx1)?e:0L))(0L, d)-rec[m-1]); } void chmax(T)(ref T x, T y){ if(x