#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int myrand() { return abs((rand() << 15) ^ rand()); }
inline int rnd(int x) { return myrand() % x; }
const int INF = (int)1e9 + 1;
const long double EPS = 1e-9;
void precalc() {}
struct Point {
  long double x, y;
  Point() {}
  Point(long double _x, long double _y) : x(_x), y(_y) {}
  inline Point operator-(const Point &p) const {
    return Point(x - p.x, y - p.y);
  }
};
const int maxn = 300 + 10;
Point qs[maxn][maxn];
int n, k;
bool read() {
  if (scanf("%d%d", &n, &k) < 2) {
    return 0;
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j <= k; ++j) {
      double y;
      scanf("%lf", &y);
      qs[i][j] = Point(j, y);
    }
  }
  return 1;
}
Point ps[maxn * maxn * 2], nps[maxn * maxn * 2];
long double get(const long double &x1, const long double &y1,
                const long double &x2, const long double &y2,
                const long double &x) {
  assert(x2 - x1 > EPS);
  return y1 + (y2 - y1) * (x - x1) / (x2 - x1);
}
int sign(const long double &x) { return x < -EPS ? -1 : x > EPS; }
void addSequence(int &n, Point *ps, int m, Point *qs, long double &S) {
  assert(n >= 1 && m >= 1);
  long double x = 0, y1 = ps[0].y, y2 = qs[0].y;
  int nn = 1;
  nps[0] = Point(0, max(y1, y2));
  for (int i = 1, j = 1; i < n || j < m;) {
    assert(i < n && j < m);
    long double nx = min(ps[i].x, qs[j].x);
    long double ny1 = get(x, y1, ps[i].x, ps[i].y, nx);
    long double ny2 = get(x, y2, qs[j].x, qs[j].y, nx);
    if (sign(y1 - y2) * sign(ny1 - ny2) == -1) {
      long double cx = (y1 - y2) / (y1 - y2 + ny2 - ny1) * (nx - x) + x;
      nps[nn++] = Point(cx, y1 + (cx - x) / (nx - x) * (ny1 - y1));
    }
    nps[nn++] = Point(nx, max(ny1, ny2));
    x = nx;
    y1 = ny1, y2 = ny2;
    if (ps[i].x <= nx + EPS) {
      ++i;
    }
    if (qs[j].x <= nx + EPS) {
      ++j;
    }
  }
  n = nn;
  S = 0;
  for (int i = 1; i < n; ++i) {
    S += (nps[i].x - nps[i - 1].x) * (nps[i].y + nps[i - 1].y) / 2;
  }
  for (int i = 0; i < n; ++i) {
    ps[i] = nps[i];
  }
}
void solve() {
  int cnt = 2;
  ps[0] = Point(0, 0);
  ps[1] = Point(k, 0);
  long double S = 0;
  for (int i = 0; i < n; ++i) {
    long double lastS = S;
    addSequence(cnt, ps, k + 1, qs[i], S);
    printf("%.18f\n", (double)(S - lastS));
  }
}
int main() {
  srand(rdtsc());
  precalc();
  while (1) {
    if (!read()) {
      break;
    }
    solve();
  }
  return 0;
}
