#include <bits/stdc++.h>
using namespace std;
const int N = 310;
const double eps = 1e-6;
struct POINT {
  double x, y;
  POINT() {}
  POINT(double _x, double _y) {
    x = _x;
    y = _y;
  }
};
struct LINE {
  double k, b;
  LINE() {}
  LINE(double _k, double _b) {
    k = _k;
    b = _b;
  }
  LINE(POINT u, POINT v) {
    k = (u.y - v.y) / (u.x - v.x);
    b = u.y - k * u.x;
  }
  double get_y(double x) { return k * x + b; }
};
bool equ(double x, double y) { return fabs(x - y) < eps; }
bool grt(double x, double y) { return x - y > eps; }
int n, k, an[N];
POINT a[N][N], b[N];
double ans;
POINT Inters(LINE l, LINE o) {
  double x, y;
  x = (l.b - o.b) / (o.k - l.k);
  y = l.k * x + l.b;
  return POINT(x, y);
}
void Insert(int x, int y, POINT u) {
  for (int i = an[x]; i >= y; --i) a[x][i + 1] = a[x][i];
  a[x][y] = u;
  ++an[x];
}
int main() {
  cin >> n >> k;
  for (int i = 0; i < k; ++i) {
    an[i] = 2;
    a[i][1] = POINT(i, 0);
    a[i][2] = POINT(i + 1, 0);
  }
  for (int ii = 1; ii <= n; ++ii) {
    ans = 0;
    for (int i = 0; i <= k; ++i) {
      int x;
      cin >> x;
      b[i] = POINT(i, x);
    }
    for (int i = 0; i < k; ++i) {
      LINE l = LINE(b[i], b[i + 1]);
      for (int j = 1; j < an[i]; ++j) {
        POINT p = Inters(l, LINE(a[i][j], a[i][j + 1]));
        if (grt(p.x, a[i][j].x) && grt(a[i][j + 1].x, p.x)) {
          Insert(i, j + 1, p);
          ++j;
        }
      }
    }
    for (int i = 0; i < k; ++i) {
      LINE l = LINE(b[i], b[i + 1]);
      for (int j = 1; j <= an[i]; ++j) {
        double _y = l.get_y(a[i][j].x);
        if (grt(_y, a[i][j].y)) {
          if (j > 1) ans += (_y - a[i][j].y) * (a[i][j].x - a[i][j - 1].x) / 2;
          if (j < an[i])
            ans += (_y - a[i][j].y) * (a[i][j + 1].x - a[i][j].x) / 2;
          a[i][j].y = _y;
        }
      }
    }
    printf("%.10lf\n", ans);
  }
  return 0;
}
