#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
struct pt {
  double x, y;
  pt(double xx = 0, double yy = 0) : x(xx), y(yy) {}
};
pt operator+(pt a, pt b) { return pt(a.x + b.x, a.y + b.y); }
pt operator-(pt a, pt b) { return pt(a.x - b.x, a.y - b.y); }
pt operator*(pt a, double n) { return pt(a.x * n, a.y * n); }
pt operator/(pt a, double n) { return pt(a.x / n, a.y / n); }
int dcmp(double x) {
  if (fabs(x) < eps) return 0;
  return x < 0 ? -1 : 1;
}
double cross(pt a, pt b) { return a.x * b.y - a.y * b.x; }
double dot(pt a, pt b) { return a.x * b.x + a.y * b.y; }
pt getinter(pt P, pt v, pt Q, pt w) {
  pt u = P - Q;
  double t = cross(w, u) / cross(v, w);
  return P + v * t;
}
int onseg(pt p, pt a, pt b) {
  return dcmp(cross(p - a, p - b)) == 0 && dcmp(dot(p - a, p - b)) <= 0;
}
int inter(pt a, pt b, pt c, pt d) {
  if (onseg(a, c, d) || onseg(b, c, d) || onseg(c, a, b) || onseg(d, a, b))
    return 1;
  int c1 = dcmp(cross(b - a, c - a)), c2 = dcmp(cross(b - a, d - a));
  int c3 = dcmp(cross(d - c, a - c)), c4 = dcmp(cross(d - c, b - c));
  return c1 * c2 < 0 && c3 * c4 < 0;
}
double cal(pt p, pt a, pt b) {
  if (a.y > b.y) swap(a, b);
  if (dcmp(p.y - a.y) >= 0) return 0;
  if (inter(a, pt(0, 100000) + a, p, b)) return 0;
  b = getinter(a, pt(10, 0), p, b - p);
  return fabs(cross(b - p, a - p)) / 2;
}
double length(pt a, pt b) { return sqrt(dot(b - a, b - a)); }
struct NN {
  int bel;
  pt p1, p2;
} nn[2100000], mm[2100000];
int num;
int cmp(NN a, NN b) { return a.p1.x < b.p1.x; }
double y[310][310];
double getpos(int n, double x, int bel) {
  return y[n][bel] + (x - bel) * (y[n][bel + 1] - y[n][bel]);
}
double gao(int n) {
  double ans = 0;
  int i, j, k, cnt = 0;
  int b1, b2;
  for (i = 1; i <= num; i++) {
    double y1 = getpos(n, nn[i].p1.x, nn[i].bel);
    double y2 = getpos(n, nn[i].p2.x, nn[i].bel);
    b1 = dcmp(y1 - nn[i].p1.y);
    b2 = dcmp(y2 - nn[i].p2.y);
    if (b1 >= 0 && b2 >= 0) {
      ans +=
          (y1 - nn[i].p1.y + y2 - nn[i].p2.y) * (nn[i].p2.x - nn[i].p1.x) / 2;
      ++cnt;
      mm[cnt].bel = nn[i].bel;
      mm[cnt].p1 = nn[i].p1;
      mm[cnt].p2 = nn[i].p2;
      mm[cnt].p1.y = y1, mm[cnt].p2.y = y2;
    } else if (b1 <= 0 && b2 <= 0) {
      ++cnt;
      mm[cnt] = nn[i];
    } else {
      pt p = getinter(nn[i].p1, nn[i].p2 - nn[i].p1, pt(nn[i].p1.x, y1),
                      pt(nn[i].p2.x, y2) - pt(nn[i].p1.x, y1));
      if (y1 >= nn[i].p1.y)
        ans += (y1 - nn[i].p1.y) * (p.x - nn[i].p1.x) / 2;
      else
        ans += (y2 - nn[i].p2.y) * (nn[i].p2.x - p.x) / 2;
      ++cnt;
      mm[cnt].bel = mm[cnt + 1].bel = nn[i].bel;
      mm[cnt].p1 = nn[i].p1, mm[cnt].p2 = p;
      ++cnt;
      mm[cnt].p1 = p, mm[cnt].p2 = nn[i].p2;
      mm[cnt - 1].p1.y = max(y1, nn[i].p1.y);
      mm[cnt].p2.y = max(y2, nn[i].p2.y);
    }
  }
  num = cnt;
  for (i = 1; i <= cnt; i++) nn[i] = mm[i];
  return ans;
}
int main() {
  int n, k, i, j;
  cin >> n >> k;
  for (i = 1; i <= n; i++)
    for (j = 0; j <= k; j++) scanf("%lf", &y[i][j]);
  num = k;
  for (i = 1; i <= num; i++)
    nn[i].bel = i - 1, nn[i].p1 = pt(i - 1, 0), nn[i].p2 = pt(i, 0);
  for (i = 1; i <= n; i++) {
    printf("%.12lf\n", gao(i));
  }
}
