#include <bits/stdc++.h>
using namespace std;
const int Max = 2000 * 1000 + 200;
vector<int> s[2];
struct xz1 {
  int mrx, urx;
  int mark = 0;
};
struct bz1 {
  int mrx, urx;
  int mark = 0;
};
xz1 xz[Max];
bz1 bz[Max];
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    int x, y;
    cin >> x >> y;
    s[0].push_back(x);
    s[1].push_back(y);
  }
  int mrx, urx;
  mrx = -1e9 - 10;
  urx = 1e9 + 10;
  for (int j = 0; j < n; j++) {
    xz[j].mrx = max(mrx, s[0][j]);
    xz[j].urx = min(urx, s[1][j]);
    mrx = xz[j].mrx;
    urx = xz[j].urx;
    if (mrx > urx) {
      xz[j].mark = 1;
    }
  }
  mrx = -1e9 - 10;
  urx = 1e9 + 10;
  int ans;
  ans = 0;
  for (int j = n - 1; j >= 0; j--) {
    bz[j].mrx = max(mrx, s[0][j]);
    bz[j].urx = min(urx, s[1][j]);
    mrx = bz[j].mrx;
    urx = bz[j].urx;
    if (mrx > urx) {
      bz[j].mark = 1;
    }
  }
  for (int i = 0; i < n; i++) {
    if (i == 0) {
      ans = max(ans, bz[1].urx - bz[1].mrx);
    } else if (i == (n - 1)) {
      ans = max(ans, xz[i - 1].urx - xz[i - 1].mrx);
    } else {
      if (xz[i - 1].mark == 0 && bz[i + 1].mark == 0) {
        int pxa, bxa;
        pxa = max(xz[i - 1].mrx, bz[i + 1].mrx);
        bxa = min(xz[i - 1].urx, bz[i + 1].urx);
        ans = max(ans, bxa - pxa);
      }
    }
  }
  cout << ans;
  return 0;
}
