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 <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
struct node
{
    double w , v , u ;
};
vector <node> list ;
bool cmp(node A,node B)
{
    return A.u > B.u ;
}
int main()
{
    //freopen("input.txt","r",stdin);
    int N ;
    double W ;
    while(scanf("%d%lf",&N,&W)==2)
    {
        list.clear();
        double ans = 0.0 ;
        for(int i=0;i<N;i++)
        {
            node obj ;
            scanf("%lf%lf",&obj.w,&obj.v);
            obj.u = obj.v / obj.w ;
            if(obj.w<=0&&obj.v>=0) { W-=obj.w; ans+=obj.v; continue ; }
            if(obj.w>=0&&obj.v<=0) continue ;
            if(obj.w<=0&&obj.v<=0) { W-=obj.w; ans+=obj.v; obj.w*=-1.0; obj.v*=-1.0; }
            list.push_back(obj);
        }
        sort(list.begin(),list.end(),cmp);
        for(int i=0;i<list.size();i++)
        {
            if(list[i].w<=W)
            {
                W-=list[i].w;
                ans+=list[i].v;
            }
            else
            {
                ans+=list[i].u*W;
                W=0.0;
            }
        }
        printf("%.8lf\n",ans);
    }
    return 0;
}