#include <bits/stdc++.h>
using namespace std;
inline int toInt(string s) {
  int v;
  istringstream sin(s);
  sin >> v;
  return v;
}
template <class T>
inline string toString(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}
template <class T>
inline T sqr(T x) {
  return x * x;
}
const double EPS = 1e-10;
const double PI = acos(-1.0);
const int INF = INT_MAX;
const int MAX_SIZE = 400007;
long long segMax[MAX_SIZE - 1], segAdd[MAX_SIZE - 1];
int n;
void add(int a, int b, int x, int k = 0, int l = 0, int r = n) {
  if (r <= a || b <= l) return;
  if (a <= l && r <= b) {
    segAdd[k] += x;
    while (k) {
      k = (k - 1) / 2;
      segMax[k] = max(segMax[k * 2 + 1] + segAdd[k * 2 + 1],
                      segMax[k * 2 + 2] + segAdd[k * 2 + 2]);
    }
    return;
  }
  add(a, b, x, k * 2 + 1, l, (l + r) / 2);
  add(a, b, x, k * 2 + 2, (l + r) / 2, r);
}
long long getMax(int a, int b, int k = 0, int l = 0, int r = n) {
  if (r <= a || b <= l) return 0LL;
  if (a <= l && r <= b) return (segMax[k] + segAdd[k]);
  long long left = getMax(a, b, k * 2 + 1, l, (l + r) / 2);
  long long right = getMax(a, b, k * 2 + 2, (l + r) / 2, r);
  return (max(left, right) + segAdd[k]);
}
int main() {
  memset((segMax), 0, sizeof(segMax));
  memset((segAdd), 0, sizeof(segAdd));
  int N;
  cin >> N;
  n = 100003;
  for (long long i = (0); i < (N); ++i) {
    int l, r;
    cin >> l >> r;
    add(l, r + 1, 1);
  }
  int res = 0;
  for (long long i = (0); i < (100001); ++i) {
    if (getMax(i, i + 1) + 1 >= i) {
      res = i;
    }
  }
  cout << res - 1 << endl;
  return 0;
}
