#include <bits/stdc++.h>
using namespace std;
struct BST {
multimap<int,int>m;
void insert(int key, int val) {
auto it=m.emplace(key,val);
if(it!=m.begin()&&it->second<=prev(it)->second){
m.erase(it);
return;
}
it++;
while(it!=m.end()&&val>=it->second){
it=m.erase(it);
}
}
int range_max(int kk, int k) {
auto it=m.upper_bound(k);
if(it==m.begin())return 0;
return prev(it)->second;
}
};
BST s[400001];
void insert(int i,int l,int r,int x,int y,int v){
if(l>x||r<x){
return;
}
s[i].insert(y,v);
if(l==r){
return;
}
insert(i*2+1,l,(l+r)/2,x,y,v);
insert(i*2+2,(l+r)/2+1,r,x,y,v);
}
int query_max(int i,int l,int r,int x0,int y0,int x1,int y1){
if(l>x1||r<x0){
return 0;
}
if(l>=x0&&r<=x1){
return s[i].range_max(y0,y1);
}
int ans1=query_max(i*2+1,l,(l+r)/2,x0,y0,x1,y1);
int ans2=query_max(i*2+2,(l+r)/2+1,r,x0,y0,x1,y1);
return max(ans1,ans2);
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
#ifdef CB
freopen("be2.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
int N;
cin>>N;
vector<int>r(N),a(N);
for(int i=0;i<N;i++){
cin>>r[i]>>a[i];
}
auto w=r;
sort(w.begin(),w.end());
for(int i=0;i<N;i++){
r[i]=lower_bound(w.begin(),w.end(),r[i])-w.begin()+1;
}
int ans=0;
for(int i=0;i<N;i++){
int v=query_max(0,1,100000,1,1,r[i]-1,a[i]-1)+1;
insert(0,1,100000,r[i],a[i],v);
ans=max(ans,v);
}
cout<<ans<<'\n';
return 0;
}