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<cstring>
#include<string>
#include<vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#include<list>
#include<set>
#include<map>
#include<sstream>
#include<climits>
#define rep(X,Y) for (int (X) = 0;(X) < (Y);++(X))
#define rrep(X,Y) for (int (X) = (Y)-1;(X) >=0;--(X))
#define all(X) (X).begin(),(X).end()
#define fi first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};

const int MAX_N = 100000;
int N, W;
double V;
int w[MAX_N], v[MAX_N];
vector<pair<double, int> > r;

int main() {
  cin >> N >> W;
  rep(i, N) {
    cin >> w[i] >> v[i];
    if (w[i] >= 0 && v[i] <= 0) {
      continue;
    } else if (w[i] <= 0 && v[i] >= 0) {
      W -= w[i];
      V += v[i];
    } else {
      if (w[i] < 0 && v[i] < 0) {
        W -= w[i];
        V += v[i];
        w[i] = -w[i];
        v[i] = -v[i];
        r.push_back(pair<double, int>((double)v[i]/(double)w[i], i));
      } else {
        r.push_back(pair<double, int>((double)v[i]/(double)w[i], i));
      }
    }
  }
  
  sort(all(r), greater<pair<double, int> >());

  for (int i = 0; i < (int)r.size(); ++i) {
    int t = r[i].sc;
    if (W >= w[t]) {
      W -= w[t]; V += v[t];
    } else {
      V += double((double)W/(double)w[t]*(double)v[t]);
      break;
    }
  }

  printf("%.6f\n", V);
  return 0;
}