#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn= 2e5 + 5 ;
const int mod= 1000 ;
ll t, n, dp[ maxn] ;
struct node{
ll w, h;
} a[ maxn] ;
bool cmp ( node a, node b) {
return a. w< b. w;
}
int main ( ) {
cin>> n;
for ( int i= 1 ; i<= n; i++ ) {
cin>> a[ i] . w>> a[ i] . h;
}
sort ( a+ 1 , a+ n+ 1 , cmp) ;
for ( int i= 1 ; i<= n; i++ ) {
dp[ i] = 1 ;
}
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 1 ; j< i; j++ ) {
if ( a[ j] . h< a[ i] . h)
dp[ i] = max ( dp[ i] , dp[ j] + 1 ) ;
}
}
for ( int i= 1 ; i<= n; i++ ) {
ans= max ( ans, dp[ i] ) ;
}
cout<< ans<< endl;
return 0 ;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn= 2e5 + 5 ;
const int mod= 1000 ;
const int INF= 0x3f3f3f3f ;
ll t, n, dp[ maxn] , b[ maxn] ;
struct node{
ll w, h;
} a[ maxn] ;
bool cmp ( node a, node b) {
return a. w< b. w;
}
int main ( ) {
cin>> n;
for ( int i= 1 ; i<= n; i++ ) {
cin>> a[ i] . w>> a[ i] . h;
}
sort ( a+ 1 , a+ n+ 1 , cmp) ;
for ( int i= 1 ; i<= n; i++ ) {
dp[ i] = INF;
}
for ( int i= 1 ; i<= n; i++ ) {
* lower_bound ( dp+ 1 , dp+ n+ 1 , a[ i] . h) = a[ i] . h;
}
cout<< lower_bound ( dp+ 1 , dp+ n+ 1 , INF) - dp- 1 << endl;
return 0 ;
}