#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cassert>
#include <cstring>
#include "immintrin.h"
#include "nmmintrin.h"
using namespace std;

using flt=float;
#define clamp(x,l,r) (x<l?l:x>r?r:x)
const int e3=1000;

#pragma GCC optimize ("Ofast")
#pragma GCC target ("avx2")

#define maxd(x,y) (x>=y?x:y)
#define mt __m256
#define PER 8

void mmmaxv(mt *a,mt *b,flt o,int l,int r) {
	for(int i=l;i<=r;i++) {
		mt bo=_mm256_add_ps(b[i],_mm256_set1_ps(o));
		mt mask=_mm256_cmp_ps(a[i],bo,1);
		mt x=_mm256_andnot_ps(mask,a[i]);
		mt y=_mm256_and_ps(mask,bo);
		a[i]=_mm256_or_ps(x,y);
	}
}
void maxv(flt *a,flt *b,flt o,int l,int r) {
	mmmaxv((mt *)a,(mt *)b,o,l/PER,(r+PER-1)/PER);
	// for(int i=l;i<=r;i++) a[i]=maxd(a[i],b[i]+o);
}

/*
** float a = b == 0 ? b : c;
…which replaces a by b if its value is zero, and by c otherwise. One way to do this is again with
masks:
__m128 mask = _mm_cmpeq_ps( a4, _mm_setzero_ps() );
__m128 part1 = _mm_and_ps( mask, b4 );
__m128 part2 = _mm_andnot_ps( mask, c4 );
a4 = _mm_or_ps( part1, part2 );
*/


int main() { /* CURSOR START */
	ios_base::sync_with_stdio(0); cin.tie(0);
	const int N=100<<10;
	int n,K; cin>>n>>K;
	if(K>n) K=n;
	static flt p[N];
	static int 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[61];
	_p2[0]=1; for(int i=1;i<=60;i++) _p2[i]=_p2[i-1]/2;
	#define p2(e) _p2[min(60,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][61];
	for(int r=1;r<=n;r++) for(int l=max(1,r-60);l<=r;l++) {
			add[r][r-l]=0;
			if(d[r]-d[l]>60) 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]);
			}
		}

	int ml=max(n/2-30,1);
	int mr=min(n/2+30,n);
	assert(1<=ml && ml<=mr && mr<=n && mr-ml<=60);

	static flt dpl[64][N];
	for(int i=1;i<=mr;i++) {
		flt *ndp=dpl[i&63];
		// memcpy(ndp,dpl[(i-1)&63],sizeof dpl[i&63]);
		memset(ndp,0,sizeof dpl[i&63]);
		for(int j=max(1,i-60);j<=i;j++) {
			if(d[i]-d[j]>60) continue;
			flt z=add[i][i-j];
			flt *odp=dpl[(j-1)&63];
			int ub=min(K-1,j-1);
			int lb=max(0,K-(n-i)-1);
			// int ub=min(int(.6*(K-1)),j-1);
			// for(int k=0;k<=ub;k++) if(odp[k]+z>ndp[k]) ndp[k]=odp[k]+z;
			// for(int k=lb;k<=ub;k++) ndp[k]=maxd(ndp[k],odp[k]+z);
			maxv(ndp,odp,z,lb,ub);
		}
		int ub=min(K,i);
		memcpy(ndp+1,ndp,(N-1)*sizeof(flt));
		// for(int k=ub;--k>=0;) ndp[k+1]=maxd(ndp[k+1],dpl[(i-1)&63][k+1]);
		maxv(ndp,dpl[(i-1)&63],0,0,ub);
		ndp[0]=0;
	}
	static flt dpr[64][N];
	for(int i=n;i>=ml;i--) {
		flt *ndp=dpr[i&63];
		// memcpy(ndp,dpr[(i+1)&63],sizeof dpr[i&63]);
		memset(ndp,0,sizeof dpr[i&63]);
		for(int j=min(n,i+60);j>=i;j--) {
			if(d[j]-d[i]>60) continue;
			flt z=add[j][j-i];
			flt *odp=dpr[(j+1)&63];
			int ub=min(K-1,n-j);
			int lb=max(0,K-(i-1)-1);
			// int ub=min(int(.6*(K-1)),n-j);
			// for(int k=0;k<=ub;k++) if(odp[k]+z>ndp[k]) ndp[k]=odp[k]+z;
			// for(int k=lb;k<=ub;k++) ndp[k]=maxd(ndp[k],odp[k]+z);
			maxv(ndp,odp,z,lb,ub);
		}
		int ub=min(K,n-i+1);
		memcpy(ndp+1,ndp,(N-1)*sizeof(flt));
		// for(int k=ub;--k>=0;) ndp[k+1]=maxd(ndp[k+1],dpr[(i+1)&63][k+1]);
		maxv(ndp,dpr[(i+1)&63],0,0,ub);
		ndp[0]=0;
	}

	flt z=0;
	for(int i=ml;i<mr;i++) for(int kl=0;kl<=K;kl++) {
			int kr=K-kl;
			if(kl>i || kr>n-i) continue;
			z=max(z,dpl[i&63][kl]+dpr[(i+1)&63][kr]);
		}
	cout<<fixed<<setprecision(9)<<z<<endl;
}
