#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void checkMin(T& a, T b) {
  if (b < a) a = b;
}
template <class T>
inline void checkMax(T& a, T b) {
  if (b > a) a = b;
}
inline int& RD(int& x) {
  scanf("%d", &x);
  return x;
}
inline int& RD(int& x, int& y) {
  scanf("%d%d", &x, &y);
  return x;
}
inline int& RD(int& x, int& y, int& z) {
  scanf("%d%d%d", &x, &y, &z);
  return x;
}
inline void WT(int x) { printf("%d\n", x); }
inline void WT(int x, int y) { printf("%d %d\n", x, y); }
inline void WT(int x, int y, int z) { printf("%d %d %d\n", x, y, z); }
inline long long& RD(long long& x) {
  scanf("%I64d", &x);
  return x;
}
inline long long& RD(long long& x, long long& y) {
  scanf("%I64d%I64d", &x, &y);
  return x;
}
inline long long& RD(long long& x, long long& y, long long& z) {
  scanf("%I64d%I64d%I64d", &x, &y, &z);
  return x;
}
inline void WT(long long x) { printf("%I64d\n", x); }
inline void WT(long long x, long long y) { printf("%I64d %I64d\n", x, y); }
inline void WT(long long x, long long y, long long z) {
  printf("%I64d %I64d %I64d\n", x, y, z);
}
inline double& RD(double& x) {
  scanf("%lf", &x);
  return x;
}
inline double& RD(double& x, double& y) {
  scanf("%lf%lf", &x, &y);
  return x;
}
inline double& RD(double& x, double& y, double& z) {
  scanf("%lf%lf%lf", &x, &y, &z);
  return x;
}
inline void WT(double x) { printf("%.10f\n", x); }
inline void WT(double x, double y) { printf("%.6f %.6f\n", x, y); }
inline void WT(double x, double y, double z) {
  printf("%.6f %.6f %.6f\n", x, y, z);
}
double curArea = 0, ans[310];
int n, k, cv, a[310][310];
pair<double, double> v[91000], nv[91000];
bool mark[910000];
double calcArea(pair<double, double> v[], int n) {
  double s = 0;
  for (int i = 0; i < (int)(n - 1); i++)
    s += (v[i].second + v[i + 1].second) * (v[i + 1].first - v[i].first);
  return s * 0.5;
}
int main() {
  RD(n, k);
  for (int i = 0; i < (int)(n); i++)
    for (int j = 0; j < (int)(k + 1); j++) RD(a[i][j]);
  for (int i = 0; i < (int)(n); i++) ans[i] = 0;
  for (int t = 0; t < (int)(k); t++) {
    curArea = 0;
    cv = 2;
    v[0] = make_pair(0, 0);
    v[1] = make_pair(1, 0);
    mark[0] = mark[1] = false;
    for (int i = 0; i < (int)(n); i++) {
      double delta = a[i][t + 1] - a[i][t];
      int nn = cv;
      cv = 0;
      for (int j = 0; j < (int)(nn - 1); j++) {
        double x1 = v[j].first, y1 = delta * x1 + a[i][t];
        double x2 = v[j + 1].first, y2 = delta * x2 + a[i][t];
        double y3 = v[j].second;
        double y4 = v[j + 1].second;
        if (y1 <= y3 && y2 <= y4) {
          nv[cv++] = make_pair(x1, y3);
          nv[cv++] = make_pair(x2, y4);
        } else if (y1 >= y3 && y2 >= y4) {
          nv[cv++] = make_pair(x1, y1);
          nv[cv++] = make_pair(x2, y2);
        } else if (y1 >= y3) {
          nv[cv++] = make_pair(x1, y1);
          double nx = x1 + (x2 - x1) * (y1 - y3) / (y1 + y4 - y2 - y3);
          double ny = y1 - (y1 - y2) * (y1 - y3) / (y1 + y4 - y2 - y3);
          nv[cv++] = make_pair(nx, ny);
          nv[cv++] = make_pair(x2, y4);
        } else {
          nv[cv++] = make_pair(x1, y3);
          double nx = x1 + (x2 - x1) * (y1 - y3) / (y1 + y4 - y2 - y3);
          double ny = y1 - (y1 - y2) * (y1 - y3) / (y1 + y4 - y2 - y3);
          nv[cv++] = make_pair(nx, ny);
          nv[cv++] = make_pair(x2, y2);
        }
      }
      nn = cv;
      cv = 1;
      v[0] = nv[0];
      for (int j = (1); j <= (int)(nn - 1); j++) {
        if (nv[j].first == nv[j - 1].first) continue;
        v[cv++] = nv[j];
      }
      double tmpArea = calcArea(v, cv);
      ans[i] += tmpArea - curArea;
      curArea = tmpArea;
    }
  }
  for (int i = 0; i < (int)(n); i++) WT(ans[i]);
  return 0;
}
