Problem: Problem statement

Real variables $ x_1, x_2, ..., x_N $ satisfy the following conditions.

1. $ 0 \ leq x_i \ leq 1 $ ($ 1 \ leq i \ leq N $)
2. $ w_1x_1 + w_2x_2 + ... + w_Nx_N \ leq W $



At this time, find the maximum value that $ v_1x_1 + v_2x_2 + ... + v_Nx_N $ can take. It is known that such a maximum actually exists.

Constraint

* $ 1 \ leq N \ leq 10 ^ 5 $
* $ 1 \ leq W \ leq 10 ^ 5 $
* $ -10 ^ 4 \ leq w_i \ leq 10 ^ 4 $
* $ -10 ^ 4 \ leq v_i \ leq 10 ^ 4 $



input

Input follows the following format. All given numbers are integers.


$ N $ $ W $
$ w_1 $ $ v_1 $
$ w_2 $ $ v_2 $
$ ... $
$ w_N $ $ v_N $

output

Output the maximum possible value of $ v_1x_1 + v_2x_2 + ... + v_Nx_N $ on one line. The output must not have an error greater than $ 10 ^ {-3} $.

Examples

Input

1 1
3 1


Output

0.333333


Input

2 3
3 3
1 2


Output

4.000000


Input

2 1
-1 -3
3 10


Output

3.666667

Solution (in CPP):

Solution:
#include<stdio.h>
#include<algorithm>
using namespace std;
pair<double,pair<int,int> > p[110000];
pair<double,pair<int,int> > q[110000];
int main(){
	int a,b;
	scanf("%d%d",&a,&b);
	int sz=0;
	int s2=0;
	double val=0;
	for(int i=0;i<a;i++){
		int w,v;
		scanf("%d%d",&w,&v);
		if(v>=0&&w<=0){
			val+=v;
			b-=w;
		}else if(v<=0&&w>=0){
			continue;
		}else if(v>0){
			p[sz++]=make_pair((double)w/v,make_pair(w,v));
		}else{
			b-=w;
			val+=v;
			p[sz++]=make_pair((double)w/v,make_pair(-w,-v));
		}
	}
	std::sort(p,p+sz);
	std::sort(q,q+s2);
	int lb=b;
	double tmp=val;
	double ret=0;
	int at=0;
	for(int i=0;i<=s2;i++){
		while(at<sz&&b-p[at].second.first>=0){
			b-=p[at].second.first;
			val+=(double)p[at].second.second;
			at++;
		}
		if(at<sz)ret=max(ret,val+(double)p[at].second.second*b/p[at].second.first);
		else ret=max(ret,val);
		if(i<s2){
			b-=q[i].second.first;
			val+=q[i].second.second;
		}
	}
	at=0;
	val=tmp;
	b=lb;
	for(int i=0;i<sz;i++){
		val+=p[i].second.second;
		b-=p[i].second.first;
		while(at<s2&&b-q[at].second.first<0){
			b-=q[at].second.first;
			val+=(double)q[at].second.second;
			at++;
		}
	//	printf("%f %d %d\n",val,b,at);
		if(at>=s2)break;
		if(b<0)ret=max(ret,val+(double)b/q[at].second.first*q[at].second.second);
		else ret=max(ret,val);
	}
	printf("%.12f\n",ret);
}