#include <bits/stdc++.h>
struct Point {
  double x, y;
};
struct Polygon {
  Point p[100000];
  int n;
  inline double get(int i, double x) {
    if (i < 0) return p[0].y;
    if (i >= n - 1) return p[n - 1].y;
    return p[i].y +
           (x - p[i].x) * (p[i + 1].y - p[i].y) / (p[i + 1].x - p[i].x);
  }
  double area() {
    double sum = 0;
    for (int i = 0; i < n - 1; i++)
      sum += (p[i + 1].x - p[i].x) * (p[i + 1].y + p[i].y) / 2;
    return sum;
  }
};
Polygon poly[2];
Polygon inp;
Polygon ta;
Polygon tb;
void intersect(Polygon& res, Polygon& a, Polygon& b) {
  ta.n = tb.n = res.n = 0;
  int ai = 0, bi = 0;
  while (ai < a.n || bi < b.n) {
    if (ai < a.n && (bi >= b.n || a.p[ai].x < b.p[bi].x)) {
      tb.p[tb.n].x = a.p[ai].x;
      tb.p[tb.n++].y = b.get(bi - 1, a.p[ai].x);
      ta.p[ta.n++] = a.p[ai++];
    } else {
      ta.p[ta.n].x = b.p[bi].x;
      ta.p[ta.n++].y = a.get(ai - 1, b.p[bi].x);
      tb.p[tb.n++] = b.p[bi++];
    }
  }
  for (int i = 0, next = 0; i < ta.n; i = next) {
    while (next < ta.n && ta.p[next].x - ta.p[i].x < 1e-6) next++;
    res.p[res.n].x = ta.p[i].x;
    res.p[res.n++].y = (ta.p[i].y > tb.p[i].y ? ta.p[i].y : tb.p[i].y);
    if (next < ta.n &&
        (ta.p[i].y - tb.p[i].y) * (ta.p[next].y - tb.p[next].y) < -1e-6) {
      double t = (tb.p[i].y - ta.p[i].y) /
                 (ta.p[next].y - ta.p[i].y - tb.p[next].y + tb.p[i].y);
      res.p[res.n].x = ta.p[i].x + t * (ta.p[next].x - ta.p[i].x);
      res.p[res.n++].y = ta.p[i].y + t * (ta.p[next].y - ta.p[i].y);
    }
  }
}
int main() {
  int n;
  scanf("%d%d", &n, &inp.n);
  inp.n++;
  for (int i = 0; i < inp.n; i++) inp.p[i].x = i;
  int cur = 0;
  double prev = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < inp.n; j++) scanf("%lf", &inp.p[j].y);
    if (i == 0)
      memcpy(&poly[1 - cur], &inp, sizeof inp);
    else
      intersect(poly[1 - cur], poly[cur], inp);
    cur = 1 - cur;
    double area = poly[cur].area();
    printf("%lf\n", area - prev);
    prev = area;
  }
  return 0;
}
