#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-8;
typedef vector<complex<double> > Polygon;
inline int sign(double a) { return (a > EPS ? 1 : a < -EPS ? -1 : 0); }
inline double dot(complex<double> a, complex<double> b) {
  return real(conj(a) * b);
}
inline double cross(complex<double> a, complex<double> b) {
  return imag(conj(a) * b);
}
inline int ccw(complex<double> a, complex<double> b, complex<double> c) {
  b -= a;
  c -= a;
  if (cross(b, c) > EPS) return +1;
  if (cross(b, c) < -EPS) return -1;
  if (dot(b, c) < 0) return +2;
  if (norm(b) < norm(c)) return -2;
  return 0;
}
struct Line : public vector<complex<double> > {
  Line() {}
  Line(const complex<double>& a, const complex<double>& b) {
    push_back(a);
    push_back(b);
  }
  complex<double> vector() const { return back() - front(); }
};
inline complex<double> curr(const Polygon& a, int x) { return a[x]; }
inline complex<double> next(const Polygon& a, int x) {
  return a[(x + 1) % a.size()];
}
inline complex<double> prev(const Polygon& a, int x) {
  return a[(x - 1 + a.size()) % a.size()];
}
inline complex<double> crosspointLL(Line l, Line m) {
  double A = cross(l.vector(), m.vector());
  double B = cross(l.vector(), l[1] - m[0]);
  if (sign(A) == 0 && sign(B) == 0) return m[0];
  if (sign(A) == 0) assert(false);
  return m[0] + m.vector() * B / A;
}
void convex_cut(Polygon& P, Line l) {
  Polygon Q;
  for (int i = 0; i < P.size(); i++) {
    complex<double> A = curr(P, i), B = next(P, i);
    if (ccw(l[0], l[1], A) != -1) Q.push_back(A);
    if (ccw(l[0], l[1], A) * ccw(l[0], l[1], B) < 0)
      Q.push_back(crosspointLL(l, Line(A, B)));
  }
  P.swap(Q);
}
inline double area(const Polygon& P) {
  double A = 0;
  for (int i = 0; i < P.size(); i++) {
    A += cross(curr(P, i), next(P, i));
  }
  return abs(A) / 2.0;
}
int main() {
  int N, K;
  cin >> N >> K;
  double y[303][303];
  Line l[303][303];
  for (int i = 0; i < (int)(N); ++i)
    for (int j = 0; j < (int)(K + 1); ++j) cin >> y[i][j];
  for (int i = 0; i < (int)(N); ++i)
    for (int j = 0; j < (int)(K); ++j)
      l[i][j] =
          Line(complex<double>(0, y[i][j]), complex<double>(1, y[i][j + 1]));
  vector<double> ans(N);
  for (int x = 0; x < (int)(K); ++x) {
    Polygon P;
    P.push_back(complex<double>(0, 0));
    P.push_back(complex<double>(1, 0));
    P.push_back(complex<double>(1, 1e4 + 1));
    P.push_back(complex<double>(0, 1e4 + 1));
    double prev_area = area(P);
    for (int i = 0; i < (int)(N); ++i) {
      convex_cut(P, l[i][x]);
      double cur_area = area(P);
      ans[i] += prev_area - cur_area;
      prev_area = cur_area;
    }
  }
  for (int i = 0; i < (int)(N); ++i) {
    printf("%.12f\n", ans[i]);
  }
  return 0;
}
