#include <bits/stdc++.h>
using namespace std;
constexpr unsigned N=3e5+7;
int n,qc;
struct V{int b,c;};
array<V,N> a;
array<int,N> f;
inline void disc(){
static int d[N],dc;
dc=0;for(int i{1};i<=n;++i) d[++dc]=a[i].b;
std::sort(d+1,d+dc+1),dc=unique(d+1,d+dc+1)-d-1;
for(int i{1};i<=n;++i) a[i].b=lower_bound(d+1,d+dc+1,a[i].b)-d;
dc=0;for(int i{1};i<=n;++i) d[++dc]=a[i].c;
std::sort(d+1,d+dc+1),dc=unique(d+1,d+dc+1)-d-1;
for(int i{1};i<=n;++i) a[i].c=lower_bound(d+1,d+dc+1,a[i].c)-d;
}
struct Tql{
array<int,N> s;
static inline int l(int x){return x&(-x);}
inline void add(int x,int v){for(;x<=n;x+=l(x))s[x]=std::max(s[x],v);}
inline void del(int x){for(;x<=n;x+=l(x))s[x]=0;}
inline int max(int k){int t{0};for(;k;k^=l(k))t=std::max(t,s[k]);return t;}
}tr;
void solve(int l,int r){
array<int,N> ord;
if(l==r) return (void)++f[l];
int m{(l+r)>>1};
solve(l,m);
iota(begin(ord)+l,begin(ord)+r+1,l);
std::sort(begin(ord)+l,begin(ord)+r+1,
[](int ia,int ib)->bool{
V va{a[ia]},vb{a[ib]};
if(va.b!=vb.b) return va.b<vb.b;
return va.c<vb.c;
}
);
for(int ii{l};ii<=r;++ii){
int i{ord[ii]};
if(i<=m) tr.add(a[i].c,f[i]);
else f[i]=std::max(f[i],tr.max(a[i].c-1)+1);
}
for(int i{l};i<=m;++i) tr.del(a[i].c);
solve(m+1,r);
}
int32_t main(){
scanf("%d",&n);
for(int i{1};i<=n;++i) scanf("%d%d",&a[i].b,&a[i].c),f[i]=0;
disc();
solve(1,n);
printf("%d\n",*max_element(f.begin()+1,f.begin()+n+1));
return EXIT_SUCCESS;
}