#include <bits/stdc++.h>
using namespace std;
long long int n, k, m;
long long int vis[1007][1007];
long long int dist[507][507];
long long int path[207][207];
long long int path1[207][207];
vector<int> v2(1005, 1);
vector<vector<long long int>> v;
long long int x, y, c, z;
struct edge {
  long long int a, b, cost;
};
long long int parent[100007];
long long int find(long long int a) {
  return a == parent[a] ? a : parent[a] = find(parent[a]);
}
void dset(long long int n) {
  for (int j = 0; j <= n; j++) parent[j] = j;
}
void unio(long long int a, long long int b, long long int rank[]) {
  if (rank[find(a)] > rank[find(b)])
    parent[find(b)] = find(a);
  else if (rank[find(b)] > rank[find(a)])
    parent[find(a)] = find(b);
  else {
    parent[find(a)] = find(b);
    rank[find(b)]++;
  }
}
bool check(long long int a, long long int b) { return find(a) == find(b); }
long long int vis1[31];
long long int q, u, v1, l;
long long int d, N, e;
long long int tot;
long long int coins[10007];
long long int dp[27];
long long int a[200007], b[200007];
map<long long int, long long int> m1;
long long int solve(long long int x) {
  if (dp[x] != 0) return dp[x];
  int f = 0;
  for (int i = 1; i < x; i++) {
    if (m1[a[i]] < m1[a[x]]) {
      dp[x] = max(dp[x], 1 + solve(i));
      f = 1;
    }
  }
  if (f) return dp[x];
  return dp[x] = 1;
}
int main() {
  cin >> n;
  map<long long int, long long int> m;
  pair<long long int, long long int> p[n + 1];
  multiset<long long int> a, b;
  for (int i = 1; i <= n; i++) {
    cin >> x >> y;
    p[i - 1].first = x;
    p[i - 1].second = y;
    a.insert(x);
    b.insert(y);
  }
  long long int d = 0;
  for (int i = 1; i <= n; i++) {
    a.erase(a.find(p[i - 1].first));
    b.erase(b.find(p[i - 1].second));
    x = *a.rbegin();
    y = *b.begin();
    d = max(d, y - x);
    a.insert(p[i - 1].first);
    b.insert(p[i - 1].second);
  }
  cout << d << endl;
}
