#include #include #include #include using namespace std; using flt=double; #define clamp(x,l,r) (xr?r:x) const int e3=1000; int main() { /* CURSOR START */ ios_base::sync_with_stdio(0); cin.tie(0); const int N=1<<20; int n,K; cin>>n>>K; static int p[N],d[N]; for(int i=1;i<=n;i++) cin>>p[i]>>d[i]; assert(n==clamp(n,1,100*e3) && K==clamp(K,1,100*e3)); d[0]=-1; d[n+1]=d[n]+1; for(int i=1;i<=n;i++) assert(p[i]==clamp(p[i],1,100) && d[i]==clamp(d[i],0,8*e3*e3) && d[i]>d[i-1]); static flt _p2[81]; _p2[0]=1; for(int i=1;i<=80;i++) _p2[i]=_p2[i-1]/2; #define p2(e) _p2[min(80,e)] static flt pfx[N],sfx[N]; pfx[0]=sfx[n+1]=0; for(int i=1;i<=n;i++) pfx[i]=pfx[i-1]*p2(d[i]-d[i-1])+p[i]; for(int i=n;i>=1;i--) sfx[i]=sfx[i+1]*p2(d[i+1]-d[i])+p[i]; static flt add[N][81]; for(int r=1;r<=n;r++) for(int l=max(1,r-80);l<=r;l++) { add[r][r-l]=0; if(d[r]-d[l]>80) continue; for(int i=l;i<=r;i++) { flt lef=pfx[i]-p2(d[i]-d[l-1])*pfx[l-1]; flt rig=sfx[i]-p2(d[r+1]-d[i])*sfx[r+1]; add[r][r-l]=max(add[r][r-l],lef+rig-p[i]); } } auto solve=[&](flt l) -> pair { static pair dp[N]; dp[0]={0,0}; for(int i=1;i<=n;i++) { dp[i]=dp[i-1]; for(int j=max(1,i-80);j<=i;j++) dp[i]=max(dp[i],make_pair(dp[j-1].first-l+add[i][i-j],dp[j-1].second+1)); } // dbg(l,dp[n]); return dp[n]; }; flt l_l=0,l_r=300; for(int its=0;its<40;its++) { flt l=(l_l+l_r)/2; int k=solve(l).second; if(k==K) { l_l=l_r=l; break; } (k>K?l_l:l_r)=l; } auto res=solve(l_l); cout<