#include <bits/stdc++.h>
using namespace std;
const int N = 305;
const int inf = 1000000005;
const double eps = 1e-8;
int dcmp(double d) { return d < -eps ? -1 : d > eps; }
struct Point {
  double x, y;
  Point() {}
  Point(double _x, double _y) {
    x = _x;
    y = _y;
  }
};
int n, k;
struct Pol {
  vector<Point> p;
  inline void input() {
    p.clear();
    for (int i = 0; i <= k; i++) {
      double y;
      scanf("%lf", &y);
      p.push_back(Point(i, y));
    }
  }
  inline double area() {
    double ret = 0.0;
    for (int i = 1; i < p.size(); i++) {
      ret += (p[i].y + p[i - 1].y) * (p[i].x - p[i - 1].x) / 2.0;
    }
    return ret;
  }
} a[N];
double get(Point a, Point b, double x) {
  return a.y + (x - a.x) / (b.x - a.x) * (b.y - a.y);
}
vector<Point> merge(vector<Point> a, vector<Point> b) {
  int i = 0, j = 0;
  vector<Point> ret;
  ret.push_back(Point(0, max(a[0].y, b[0].y)));
  while (i + 1 < a.size() && j + 1 < b.size()) {
    double l = ret.back().x, r = min(a[i + 1].x, b[j + 1].x);
    double left_1 = get(a[i], a[i + 1], l), left_2 = get(b[j], b[j + 1], l);
    double right_1 = get(a[i], a[i + 1], r), right_2 = get(b[j], b[j + 1], r);
    if (dcmp(left_1 - left_2) * dcmp(right_1 - right_2) < 0) {
      double x = l + fabs(left_1 - left_2) /
                         (fabs(left_2 - left_1) + fabs(right_1 - right_2)) *
                         (r - l);
      ret.push_back(Point(x, get(a[i], a[i + 1], x)));
    } else
      ret.push_back(Point(r, max(right_2, right_1)));
    if (dcmp(a[i + 1].x - ret.back().x) <= 0) i++;
    if (dcmp(b[j + 1].x - ret.back().x) <= 0) j++;
  }
  return ret;
}
int main() {
  scanf("%d %d", &n, &k);
  a[0].input();
  double last = a[0].area();
  printf("%.12f\n", last);
  for (int i = 1; i < n; i++) {
    a[i].input();
    a[i].p = merge(a[i].p, a[i - 1].p);
    double area = a[i].area();
    printf("%.12f\n", area - last);
    last = area;
  }
  return 0;
}
