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 <cassert>// c
#include <ctime>
#include <iostream>// io
#include <iomanip>
#include <fstream>
#include <sstream>
#include <vector>// container
#include <map>
#include <set>
#include <queue>
#include <bitset>
#include <stack>
#include <algorithm>// other
#include <utility>
#include <complex>
#include <numeric>
#include <functional>
#include <random>
#include <regex>

using namespace std;
typedef long long ll;

#define ALL(c) (c).begin(),(c).end()
#define FOR(i,l,r) for(int i=(int)l;i<(int)r;++i)
#define REP(i,n) FOR(i,0,n)
#define FORr(i,l,r) for(int i=(int)r-1;i>=(int)l;--i)
#define REPr(i,n) FORr(i,0,n)
#define EACH(i,c) for(__typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define IN(l,v,r) ((l)<=(v) && (v)<(r))
#define UNIQUE(v) v.erase(unique(ALL(v)),v.end())
//debug
#define DUMP(x)  cerr << #x << " = " << (x)
#define LINE()    cerr<< " (L" << __LINE__ << ")"

int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cout <<fixed <<setprecision(20);

	int N;double W;cin >> N >> W;
	vector<double> ws(N),vs(N);REP(i,N)cin >> ws[i] >> vs[i];


	double res=0;
	vector<pair<double,int> > val;
	REP(i,N){
		if(vs[i]>=0 && ws[i]<=0){
			res+=vs[i];W-=ws[i];
		}
		if(vs[i]<0 && ws[i]<0){
			val.push_back(make_pair(vs[i]/ws[i],i));
			res-=abs(vs[i]);W+=abs(ws[i]);
		}
		if(vs[i]>0 && ws[i]>0){
			val.push_back(make_pair(vs[i]/ws[i],i));
		}
	}

	sort(ALL(val),greater<pair<double,int> >());
	REP(i,val.size()){
		int ind=val[i].second;
		double use=min(1.0,W/abs(ws[ind]));
		res+=use*abs(vs[ind]);
		W-=use*abs(ws[ind]);
	}
	cout << res << endl;
 	return 0;
 }