#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int MAX_INT = 0x3f3f3f3f;
typedef pair<int,int> PII;
const int N = 1e5+10;
struct Unit{
int l,r;
};
Unit unit[N];
bool cmp(Unit u1,Unit u2)
{
return u1.l<u2.l;
}
int main(){
int n;
cin>>n;
int ans=1;
for(int i=1;i<=n;i++)
{
cin>>unit[i].l>>unit[i].r;
}
//按左端点排序
sort(unit+1,unit+1+n,cmp);
//小根堆,保存所有集合的右端点,它的大小就是集合的个数
priority_queue<int,vector<int>,greater<int>> pq;
for(int i=1;i<=n;i++)
{
// 当前区间不能放到现有集合中 即当前区间的左端点小于已有区间的右边界 即有重叠
if(pq.size()==0 || unit[i].l<=pq.top()){
// 新开一个集合,并将右端点放入
pq.push(unit[i].r);
}else{
//更新放入集合的右端点
pq.pop();
pq.push(unit[i].r);
}
}
//小根堆,保存所有集合的右端点,它的大小就是集合的个数
cout<<pq.size()<<endl;
}