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<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


struct Info{
	Info(int arg_weight,int arg_value){
		weight = arg_weight;
		value = arg_value;
	}
	bool operator<(const struct Info &arg) const{
		return arg.weight*value > arg.value*weight;
	}
	int weight,value;
};

int main(){

	int N;
	double W,ans = 0;

	scanf("%d %lf",&N,&W);

	vector<Info> V;

	int weight,value;
	for(int loop = 0; loop < N; loop++){

		scanf("%d %d",&weight,&value);

		if(weight >= 0 && value <= 0)continue;

		if(weight >= 0 && value >= 0){

			V.push_back(Info(weight,value));

		}else if(weight <= 0 && value >= 0){

			ans += value;
			W -= weight;

		}else if(weight < 0 && value < 0){

			ans += value;
			W -= weight;
			V.push_back(Info(-weight,-value));
		}
	}
	sort(V.begin(),V.end());

	double tmp_x;

	for(int i = 0; i < V.size(); i++){

		tmp_x = min(1.0,W/V[i].weight);
		ans += tmp_x*V[i].value;
		W -= tmp_x*V[i].weight;
		if(W < EPS)break;
	}

	printf("%.10lf\n",ans);

	return 0;
}