#include <bits/stdc++.h>
using namespace std;
const int N = 80 + 5;
int n, m, l[N], r[N], cx[N * 2], gods, who[N];
double pl[N], pr[N], pm[N], sv[N][N][N], ans[N][N];
void add_ans(double *row, int l, int r, double w) {
  row[l] += w, row[r + 1] -= w;
}
void trans(double dp[N][N], int d) {
  for (int i = n - 1; i >= 0; --i)
    for (int j = n - 1 - i; j >= 0; --j) {
      double p = dp[i][j];
      dp[i + 1][j] += pl[d] * p;
      dp[i][j + 1] += pm[d] * p;
      dp[i][j] = pr[d] * p;
    }
}
void process(double (*nxt)[N], double dp[N][N], int l, int r) {
  for (int i = 0; i <= n - 1; ++i)
    for (int j = 0; j <= n - 1 - i; ++j) nxt[i][j] = dp[i][j];
  for (int i = l; i <= r; ++i) trans(nxt, i);
}
void calc(int ll, int rr, int c, double dp[N][N]) {
  if (ll == rr) {
    int d = who[ll];
    for (int i = 0; i <= n - 1; ++i)
      for (int j = 0; j <= n - 1 - i; ++j) {
        double p = pm[ll] * dp[i][j];
        add_ans(ans[d], gods + i, gods + i + j, p / (j + 1));
      }
    return;
  }
  int mm = (ll + rr) >> 1;
  process(sv[c], dp, mm + 1, rr), calc(ll, mm, c + 1, sv[c]);
  process(sv[c], dp, ll, mm), calc(mm + 1, rr, c + 1, sv[c]);
}
void solve(int L, int R) {
  if (L == R) return;
  gods = m = 0;
  for (int i = 1; i <= n; ++i)
    if (r[i] <= L || l[i] >= R) {
      gods += (r[i] <= L);
    } else {
      double len = r[i] - l[i];
      who[++m] = i;
      pl[m] = 1.0 * (L - l[i]) / len;
      pm[m] = 1.0 * (R - L) / len;
      pr[m] = 1.0 * (r[i] - R) / len;
    }
  if (!m) return;
  double dp[N][N] = {};
  dp[0][0] = 1;
  calc(1, m, 0, dp);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    scanf("%d%d", &l[i], &r[i]);
    cx[++cx[0]] = l[i];
    cx[++cx[0]] = r[i];
  }
  sort(cx + 1, cx + cx[0] + 1);
  for (int i = 1; i <= cx[0] - 1; ++i) {
    solve(cx[i], cx[i + 1]);
  }
  for (int i = 1; i <= n; i++, puts("")) {
    double s = 0;
    for (int j = 0; j <= n - 1; ++j) {
      s += ans[i][j];
      printf("%.12lf ", s);
    }
  }
}
