#include <bits/stdc++.h>
using namespace std;
const int nsz = 3e5;
int n, sz, ans;
struct treap {
  int sz, rt, ls[nsz + 5], rs[nsz + 5], key[nsz + 5], val[nsz + 5],
      pri[nsz + 5], del0[nsz + 5], del1[nsz + 5];
  int inline node(int w1, int w2) {
    int u = ++sz;
    key[u] = w1, val[u] = w2, pri[u] = rand();
    return u;
  }
  void inline chg(int u, int w1, int w2) {
    if (!u) return;
    if (w1) key[u] += w1, del0[u] += w1;
    if (w2) val[u] += w2, del1[u] += w2;
  }
  void inline down(int u) {
    int &w1 = del0[u], &w2 = del1[u];
    chg(ls[u], w1, w2), chg(rs[u], w1, w2);
    w1 = w2 = 0;
  }
  int merge(int v1, int v2) {
    if (!v1 || !v2) return v1 | v2;
    if (pri[v1] < pri[v2]) {
      down(v1), rs[v1] = merge(rs[v1], v2);
      return v1;
    } else {
      down(v2), ls[v2] = merge(v1, ls[v2]);
      return v2;
    }
  }
  void split(int u, int w, int &v1, int &v2) {
    if (!u) {
      v1 = v2 = 0;
      return;
    }
    down(u);
    if (key[u] <= w) {
      v1 = u, split(rs[u], w, rs[u], v2);
    } else {
      v2 = u, split(ls[u], w, v1, ls[u]);
    }
  }
  void split_val(int u, int w, int &v1, int &v2) {
    if (!u) {
      v1 = v2 = 0;
      return;
    }
    down(u);
    if (val[u] <= w) {
      v1 = u, split_val(rs[u], w, rs[u], v2);
    } else {
      v2 = u, split_val(ls[u], w, v1, ls[u]);
    }
  }
  void inline ins(int w1, int w2) {
    int v1, v2;
    split(rt, w1, v1, v2);
    rt = merge(merge(v1, node(w1, w2)), v2);
  }
  void inline rmv(int w) {
    int v1, v2, v3;
    split(rt, w - 1, v1, v2);
    split(v2, w, v2, v3);
    rt = merge(v1, v3);
  }
  void inline upd(int l, int r, int w1, int w2) {
    int v1, v2, v3;
    split(rt, l - 1, v1, v2);
    split(v2, r, v2, v3);
    chg(v2, w1, w2);
    rt = merge(merge(v1, v2), v3);
  }
  int inline largest_val(int u) {
    for (; rs[u]; down(u), u = rs[u])
      ;
    return val[u];
  }
  int inline smallest_val(int u) {
    for (; ls[u]; down(u), u = ls[u])
      ;
    return val[u];
  }
  int inline pre_val(int w) {
    int v1, v2, res;
    split(rt, w, v1, v2);
    res = largest_val(v1);
    rt = merge(v1, v2);
    return res;
  }
  int inline nxt_val(int w) {
    int v1, v2, res;
    split(rt, w - 1, v1, v2);
    res = smallest_val(v2);
    rt = merge(v1, v2);
    return res;
  }
};
treap tr;
void upd(int el, int er) {
  int k1 = tr.pre_val(el - 1);
  tr.rmv(er);
  if (el <= er - 1) tr.upd(el, er - 1, 1, 1);
  tr.ins(el, k1 + 1);
  int v1, v2, v3, k2 = tr.pre_val(er);
  tr.split(tr.rt, er, v1, v2);
  tr.split_val(v2, k2 - 1, v2, v3);
  tr.chg(v2, 0, 1);
  tr.rt = tr.merge(tr.merge(v1, v2), v3);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    int l, r;
    scanf("%d%d", &l, &r);
    upd(l, r);
  }
  ans = tr.largest_val(tr.rt);
  printf("%d\n", ans);
}
