#include #define mp make_pair #define REP(A,B) for(int (A)=0;(A)<(B);(A)++) #define pb push_back using namespace std; long double objem[111111]; long double casy[111111]; long long pritok[111111]; int A[111111]; set S; int main() { int n,F; while(scanf("%d%d", &n, &F) == 2) { S.clear(); REP(i, n) scanf("%d", A+i); priority_queue< pair, pair > > pq; REP(i, n) { objem[i] = A[i]; casy[i] = ((long double)A[i])/F; pritok[i] = F; S.insert(i); pq.push(mp(mp(-casy[i], i), mp(objem[i], pritok[i]))); } long double casPosledniho = 0; long double maxCas = 0; while(!pq.empty()) { auto curr = pq.top(); pq.pop(); long double ccas = -curr.first.first; int idx = curr.first.second; long double O = curr.second.first; long double P = curr.second.second; if(S.count(idx) == 0) { continue; } if(idx == n-1) { casPosledniho = ccas; } maxCas = max(maxCas, ccas); auto it = S.find(idx); auto naslednik = it; naslednik++; S.erase(it); if(naslednik != S.end()) { int nidx = *naslednik; pritok[nidx] += pritok[idx]; objem[nidx] += ccas*pritok[idx]; casy[nidx] = objem[nidx]/pritok[nidx]; pq.push(mp(mp(-casy[nidx], nidx), mp(objem[nidx], pritok[nidx]))); } } printf("%0.8lf %0.8lf\n", (double)casPosledniho, (double)maxCas); } return 0; }