#include <bits/stdc++.h>
using namespace std;
struct point {
  double x, y;
} temp;
vector<point> v;
vector<point> vv[310];
double areai[310];
double calC(point aa, point bb) {
  return bb.y - (bb.y - aa.y) / (bb.x - aa.x) * bb.x;
}
double calM(point aa, point bb) { return (bb.y - aa.y) / (bb.x - aa.x); }
point intersectAT(point aa, point bb, point pp, point qq) {
  double m1 = calM(aa, bb);
  double m2 = calM(pp, qq);
  double c1 = calC(aa, bb);
  double c2 = calC(pp, qq);
  point ret;
  ret.x = ret.y = -1;
  if (m1 == m2) return ret;
  ret.x = (c2 - c1) / (m1 - m2);
  ret.y = m1 * ret.x + c1;
  return ret;
}
bool notsame(point aa, point bb) { return !(aa.x == bb.x && aa.y == bb.y); }
bool test_point(point aa, point bb, point cc) {
  double m = calM(aa, bb);
  double c = calC(aa, bb);
  if (fabs(m * cc.x + c - cc.y) < 1.0e-4) return true;
  double val1 = m * cc.x + c - cc.y;
  double val2 = m * cc.x + c - 2000;
  if (val1 > 0 && val2 > 0) return true;
  if (val1 < 0 && val2 < 0) return true;
  return false;
}
bool compare(point aa, point bb) { return aa.x < bb.x; }
double make_areai(int pos) {
  int i, j, k = vv[pos].size();
  for (j = 1; j < k; j++) {
    point temp_point =
        intersectAT(vv[pos][j - 1], vv[pos][j], v[pos - 1], v[pos]);
    if (temp_point.x > vv[pos][j - 1].x && temp_point.x < vv[pos][j].x)
      if (notsame(temp_point, vv[pos][j - 1]) &&
          notsame(temp_point, vv[pos][j]) && notsame(temp_point, v[pos - 1]) &&
          notsame(temp_point, v[pos]))
        vv[pos].push_back(temp_point);
  }
  sort(vv[pos].begin(), vv[pos].end(), compare);
  if (vv[pos][0].y < v[pos - 1].y) vv[pos][0] = v[pos - 1];
  if (vv[pos][vv[pos].size() - 1].y < v[pos].y)
    vv[pos][vv[pos].size() - 1] = v[pos];
  for (j = 0; j < vv[pos].size(); j++) {
    if (test_point(v[pos - 1], v[pos], vv[pos][j]) == false) {
      vv[pos][j].x = 2000;
    }
  }
  sort(vv[pos].begin(), vv[pos].end(), compare);
  while (vv[pos][vv[pos].size() - 1].x == 2000) vv[pos].pop_back();
  double gg = 0, hh = 0;
  for (i = 0; i < vv[pos].size() - 1; i++) {
    gg += (vv[pos][i].x * vv[pos][i + 1].y);
    hh += (vv[pos][i].y * vv[pos][i + 1].x);
  }
  gg += (pos - 1) * vv[pos][0].y;
  hh += (pos)*vv[pos][vv[pos].size() - 1].y;
  return (gg - hh) > 0 ? (.5 * (gg - hh)) : (-.5 * (gg - hh));
}
int main() {
  ios_base::sync_with_stdio(false);
  int i, j, n, k;
  double temp_area = 0;
  cin >> n >> k;
  for (i = 1; i <= k; i++) {
    temp.y = 0;
    temp.x = i - 1;
    vv[i].push_back(temp);
    temp.x = i;
    vv[i].push_back(temp);
  }
  for (i = 1; i <= n; i++) {
    for (j = 0; j <= k; j++) {
      temp.x = j;
      cin >> temp.y;
      v.push_back(temp);
    }
    temp_area = 0;
    for (j = 1; j <= k; j++) {
      areai[i] += make_areai(j);
    }
    printf("%.6lf\n", areai[i] - areai[i - 1]);
    for (int p = 1; p <= k; p++) {
      for (j = 0; j < vv[p].size(); j++) {
      }
    }
    v.clear();
  }
  return 0;
}
