//deque<pair<ld,int> > water;
//int cur_volume;
//ld total_heat;
//void clear_to(int max_volume){
//    int need_remove = max(0,cur_volume-max_volume);
//    while(need_remove){
//        if(water.back().Y > need_remove){
//            water.back().Y -= need_remove;
//            cur_volume -= need_remove;
//            total_heat -= need_remove*water.back().X;
//            return;
//        }
//        else{
//            total_heat -= water.back().X*water.back().Y;
//            need_remove -= water.back().Y;
//            cur_volume -= water.back().Y;
//            water.pop_back();
//        }
//    }
//}
//void mix_in(ld temp, int volume){
//    while(!water.empty() && temp < water.front().X){
//        ld new_temp = (temp*volume+water.front().X*water.front().Y)
//            /(volume+water.front().Y);
//        volume += water.front().Y;
//        temp = new_temp;
//        cur_volume -= water.front().Y;
//        total_heat -= water.front().X*water.front().Y;
//        water.pop_front();
//    }
//    water.push_front({temp,volume});
//    cur_volume += water.front().Y;
//    total_heat += water.front().X*water.front().Y;
//}
//void _(){
//    ll n,L;
//    cin >> n >> L;
//    vpll arr(n);
//    cin >> arr;
//    rep(i,0,n-1){
//        clear_to(L-arr[i].Y);
//        mix_in(arr[i].X,arr[i].Y);
//        print(total_heat/cur_volume);
//    }
//}
//
#include <iomanip>
#include <algorithm>
#include <queue>
#include <cassert>
#include <vector>
#include <utility>
#include <iostream>
#include <string>
#define REP_INT(i,l,r) for(int i = l; i <= r; ++i)
#define GET_REP_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define rep(...) GET_REP_MACRO(__VA_ARGS__,REP_ANY,REP_INT)(__VA_ARGS__)
#define all(v) (v).begin(), (v).end()
#define X first
#define Y second
#define T1 template<typename T> static
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef vector<pll> vpll;
typedef long double ld;
template <typename F, typename S> static
istream& operator>>(istream& stream, pair<F, S>& t){
    return stream >> t.first >> t.second;
}
T1 ostream& operator<<(ostream& stream, const vector<T>& t);
T1 istream& read(T, T, istream& = cin);
T1 istream& operator>>(istream& stream, vector<T>& t){
    return read(all(t), stream);
}
T1 istream& read(T b, T e, istream& stream){
    for(T it = b; it != e; ++it)
        stream >> *it;
    return stream;
}
T1 void print(T x, string end = "\n"){
    cout << x << end;
}
deque<pair<ld,int> > water;
int cur_volume;
ld total_heat;
void clear_to(int max_volume){
    int need_remove = max(0,cur_volume-max_volume);
    while(need_remove){
        if(water.back().Y > need_remove){
            water.back().Y -= need_remove;
            cur_volume -= need_remove;
            total_heat -= need_remove*water.back().X;
            return;
        }
        else{
            total_heat -= water.back().X*water.back().Y;
            need_remove -= water.back().Y;
            cur_volume -= water.back().Y;
            water.pop_back();
        }
    }
}
void mix_in(ld temp, int volume){
    while(!water.empty() && temp < water.front().X){
        ld new_temp = (temp*volume+water.front().X*water.front().Y)
            /(volume+water.front().Y);
        volume += water.front().Y;
        temp = new_temp;
        cur_volume -= water.front().Y;
        total_heat -= water.front().X*water.front().Y;
        water.pop_front();
    }
    water.push_front({temp,volume});
    cur_volume += water.front().Y;
    total_heat += water.front().X*water.front().Y;
}
void _(){
    ll n,L;
    cin >> n >> L;
    vpll arr(n);
    cin >> arr;
    rep(i,0,n-1){
        clear_to(L-arr[i].Y);
        mix_in(arr[i].X,arr[i].Y);
        print(total_heat/cur_volume);
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);
        _();
}


Measured memory_bytes: 37180