Problem:
Activity Selection Problem

There are $n$ acitivities with start times $\{s_i\}$ and finish times $\{t_i\}$. Assuming that a person can only work on a single activity at a time, find the maximum number of activities that can be performed by a single person.

Input

$n$
$s_1$ $t_1$
$s_2$ $t_2$
:
$s_n$ $t_n$

The first line consists of the integer $n$. In the following $n$ lines, the start time $s_i$ and the finish time $t_i$ of the activity $i$ are given.

出力

Print the maximum number of activities in a line.

Constraints

$1 \le n \le 10^5$

$1 \le s_i \lt t_i \le 10^9 (1 \le i \le n)$

Sample Input 1

5
1 2
3 9
3 5
5 9
6 8

Sample Output 1

3

Sample Input 2

3
1 5
3 4
2 5

Sample Output 2

1

Sample Input 3

3
1 2
2 3
3 4

Sample Output 3

2

Solution in C++14 (judge verdict: Accepted)

#include<bits/stdc++.h>
#define rep(i, n) for(int i=0;i<(n);++i)
#define per(i, n) for(int i=(n)-1;i>=0;--i)
#define repa(i, n) for(int i=1;i<(n);++i)
#define foreach(i, n) for(auto &i:(n))
#define pii pair<int, int>
#define pll pair<long long, long long>
#define all(x) (x).begin(), (x).end()
#define bit(x) (1ll << (x))
using ll = long long;
const ll MOD = (ll)1e9+7;
const int INF = (ll)1e9+7;
const ll INFLL = (ll)1e18;
using namespace std;
template<class t>
using vvector = vector<vector<t>>;
template<class t>
using vvvector = vector<vector<vector<t>>>;
template<class t>
using priority_queuer = priority_queue<t, vector<t>, greater<t>>;
template<class t, class u> bool chmax(t &a, u b){if(a<b){a=b;return true;}return false;}
template<class t, class u> bool chmin(t &a, u b){if(a>b){a=b;return true;}return false;}

ll modpow(ll x, ll b){
	ll res = 1;
	while(b){
		if(b&1)res = res * x % MOD;
		x = x * x % MOD;
		b>>=1;
	}
	return res;
}

ll modinv(ll x){
	return modpow(x, MOD-2);
}

bool was_output = false;
template<class t>
void output(t a){
	if(was_output)cout << " ";
	cout << a;
	was_output = true;
}
void outendl(){
	was_output = false;
	cout << endl;
}

int main(){
	int n;
	cin >> n;
	priority_queuer<pii> pq;
	rep(i, n){
		int a, b;
		cin >> a >> b;
		pq.emplace(b, a);
	}
	int i=0;
	int ans = 0;
	while(pq.size()){
		pii d = pq.top();
		pq.pop();
		if(i < d.second){
			i = d.first;
			++ans;
		}
	}

	cout << ans << endl;
	return 0;
}