#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
const int maxn = 80 + 2, N = 170, SQ = 320, base = 800287, mod = 1e9 + 7,
          INF = 1e9 + 10, lg = 22;
const double eps = 1e-4;
int n, L[maxn], R[maxn];
double dp[maxn][maxn], res[maxn];
vector<int> vec;
inline void calc(int l, int r, int p) {
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n - i; ++j) {
      dp[i][j] = 0.;
    }
  }
  int sz = 0;
  dp[0][0] = 1.;
  for (int i = 0; i < n; ++i) {
    if (i == p) {
      continue;
    }
    sz++;
    if (R[i] <= l) {
      for (int a = sz; a > 0; --a) {
        for (int b = sz - a; b >= 0; --b) {
          dp[a][b] = dp[a - 1][b];
        }
      }
      for (int b = sz; b >= 0; --b) {
        dp[0][b] = 0.;
      }
    } else if (L[i] <= l) {
      double delta1 = (double)(l - L[i]) / (R[i] - L[i]);
      double delta2 = (double)(r - l) / (R[i] - L[i]);
      double delta3 = 1. - delta1 - delta2;
      for (int a = sz; a >= 0; --a) {
        for (int b = sz - a; b >= 0; --b) {
          double pre_val = dp[a][b];
          dp[a][b] = 0.;
          if (a) {
            dp[a][b] += dp[a - 1][b] * delta1;
          }
          if (b) {
            dp[a][b] += dp[a][b - 1] * delta2;
          }
          if (a + b < sz) {
            dp[a][b] += pre_val * delta3;
          }
        }
      }
    }
  }
}
inline void update(int l, int r, int p) {
  double delta = (double)(r - l) / (R[p] - L[p]);
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n - i; ++j) {
      int s = i + 1, e = i + j + 2;
      double val = (double)(dp[i][j] * delta * (1. / (j + 1)));
      res[s] += val;
      res[e] -= val;
    }
  }
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < n; ++i) {
    cin >> L[i] >> R[i];
    vec.push_back(L[i]), vec.push_back(R[i]);
  }
  sort(vec.begin(), vec.end());
  vec.resize(unique(vec.begin(), vec.end()) - vec.begin());
  cout << setprecision(6);
  for (int i = 0; i < n; ++i) {
    memset(res, 0, sizeof res);
    for (int j = 0; j < (int)vec.size() - 1; ++j) {
      int l = vec[j], r = vec[j + 1];
      if (L[i] < r && R[i] > l) {
        calc(l, r, i);
        update(l, r, i);
      }
    }
    for (int i = 1; i <= n; ++i) {
      res[i] += res[i - 1];
      cout << fixed << res[i] << ' ';
    }
    cout << '\n';
  }
}
