#include <bits/stdc++.h>
using namespace std;
double inter(double a, double b, double c, double d) {
  return (c - a) / (b + c - a - d);
}
int Y[305][305];
vector<int> st[305];
double X[305][305];
void insert(int cur, int j, vector<int> &nst) {
  int last;
  double x;
  while (!nst.empty()) {
    last = *nst.rbegin();
    if (Y[j - 1][last] <= Y[j - 1][cur])
      nst.pop_back();
    else if (Y[j][last] >= Y[j][cur])
      break;
    else {
      x = inter(Y[j - 1][cur], Y[j][cur], Y[j - 1][last], Y[j][last]);
      if (x <= X[j][last])
        nst.pop_back();
      else
        break;
    }
  }
  if (nst.empty() || Y[j][last] < Y[j][cur]) {
    X[j][cur] = nst.empty() ? 0 : x;
    nst.push_back(cur);
  }
}
int main() {
  int N, K;
  double prevArea = 0;
  scanf("%d%d", &N, &K);
  for (int i = 1; i <= N; ++i) {
    scanf("%d", &Y[0][i]);
    vector<pair<double, double> > points;
    points.push_back(make_pair(0, 0));
    for (int j = 1; j <= K; ++j) {
      scanf("%d", &Y[j][i]);
      vector<int> nst;
      int k;
      for (k = 0; k < st[j].size(); ++k) {
        int seg = st[j][k];
        if (Y[j][seg] - Y[j - 1][seg] > Y[j][i] - Y[j - 1][i]) break;
        nst.push_back(seg);
      }
      insert(i, j, nst);
      for (; k < st[j].size(); ++k) {
        insert(st[j][k], j, nst);
      }
      st[j] = nst;
      for (auto it = nst.begin(); it != nst.end(); ++it) {
        double x = X[j][*it];
        double y = x * Y[j][*it] + (1 - x) * Y[j - 1][*it];
        points.push_back(make_pair(x + j - 1, y));
      }
    }
    points.push_back(make_pair(K, Y[K][*st[K].rbegin()]));
    points.push_back(make_pair(K, 0));
    double area = 0;
    for (int i = 0; i < points.size(); ++i) {
      int prev = i ? i - 1 : (int)points.size() - 1;
      area += points[i].first * points[prev].second -
              points[i].second * points[prev].first;
    }
    area /= 2;
    printf("%.9lf\n", area - prevArea);
    prevArea = area;
  }
}
