#include
using namespace std;
void update(int x, int y, int max_x, int max_y, int val, map<pair<int,int>, int> &mapp) {
int y1;
while (x <= max_x) {
y1 = y;
while (y1 <= max_y) {
pair<int,int> p = make_pair(x,y1);
mapp[p]=max(val,mapp[p]);
y1 += (y1 & -y1);
}
x += (x & -x);
}
}
int read(int x, int y, map<pair<int,int>, int> &mapp) {
int y1;
int val = 0;
while (x > 0) {
y1 = y;
while (y1 > 0) {
pair<int,int> p = make_pair(x,y1);
map<pair<int,int>,int>::iterator it = mapp.find§;
if(it!=mapp.end())
val = max(val,it->second);
y1 -= (y1 & -y1);
}
x -= (x & -x);
}
return val;
}
int main() {
//ios_base::sync_with_stdio(false);cin.tie(NULL);
int n, x, y;
//cin >> n;
scanf("%d",&n);
vector<pair<int,int> > v;
v.reserve(n);
vector firsts;
firsts.reserve(n);
vector seconds;
seconds.reserve(n);
map<pair<int,int>, int> mapp;
map<int,int> compressX;
map<int,int> compressY;
for(int i = 0; i<n; i++) {
//cin >> x;
//cin >> y;
scanf("%d %d",&x,&y);
v.push_back(make_pair(x,y));
firsts.push_back(x);
seconds.push_back(y);
}
sort(firsts.begin(),firsts.begin()+n);
sort(seconds.begin(),seconds.begin()+n);
compressX[firsts[0]]=1;
compressY[seconds[0]]=1;
for(int i = 1; i < n; i++) {
if(firsts[i]==firsts[i-1])
compressX[firsts[i]]=compressX[firsts[i-1]];
else
compressX[firsts[i]]=compressX[firsts[i-1]]+1;
if(seconds[i]==seconds[i-1])
compressY[seconds[i]]=compressY[seconds[i-1]];
else
compressY[seconds[i]]=compressY[seconds[i-1]]+1;;
}
int max_x=0,max_y=0;
for(int i = 0; i < n; i++) {
v[i].first = compressX[v[i].first];
v[i].second = compressY[v[i].second];
max_x=max(max_x,v[i].first);
max_y=max(max_y,v[i].second);
}
int ans = 0;
for(int i = 0; i < n; i++) {
int maximum = 0;
if(v[i].first>1&&v[i].second>1)
maximum = read(v[i].first-1,v[i].second-1, mapp);
update(v[i].first,v[i].second,max_x,max_y,maximum+1,mapp);
ans = max(ans,maximum+1);
}
printf("%d\n",ans);
//cout<< ans << endl;
return 0;
}