Problem:
Score : 400 points

Problem Statement

There are N islands lining up from west to east, connected by N-1 bridges.

The i-th bridge connects the i-th island from the west and the (i+1)-th island from the west.

One day, disputes took place between some islands, and there were M requests from the inhabitants of the islands:

Request i: A dispute took place between the a_i-th island from the west and the b_i-th island from the west. Please make traveling between these islands with bridges impossible.

You decided to remove some bridges to meet all these M requests.

Find the minimum number of bridges that must be removed.

Constraints

All values in input are integers.

2 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq a_i < b_i \leq N

All pairs (a_i, b_i) are distinct.

Input

Input is given from Standard Input in the following format:

N M
a_1 b_1
a_2 b_2
:
a_M b_M

Output

Print the minimum number of bridges that must be removed.

Sample Input 1

5 2
1 4
2 5

Sample Output 1

1

The requests can be met by removing the bridge connecting the second and third islands from the west.

Sample Input 2

9 5
1 8
2 7
3 5
4 6
7 9

Sample Output 2

2

Sample Input 3

5 10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

Sample Output 3

4

Solution in Kotlin (1.0.0) (judge verdict: Wrong Answer)

fun main(args: Array<String>) {
    val (N, M) = readInputLine().split(" ").map { it.toInt() }
    val bridges = mutableListOf<Pair<Int, Int>>()

    for (i in 1..M) {
        val (a, b) = readInputLine().split(" ").map { it.toInt() }
        bridges.add(Pair(a, b))
    }
    
    bridges.sortBy { it.second }
    bridges.sortBy { it.first }
    
    val ansList = mutableListOf<Pair<Int, Int>>()
    ansList.add(bridges.first())
    
    for ((a, b) in bridges.drop(1)) {
        println(ansList)
        if (ansList.last().first == a) {
            // 始点が同じ場合は終点がより始点に近い方のみを残す
            continue
        }
        if (b <= ansList.last().second) {
            // 包含関係にある場合は始点がより終点に近い方のみを残す
            ansList.removeAt(ansList.lastIndex)
            ansList.add(Pair(a, b))
            continue
        }
        
        if (ansList.last().let { it.first < a && it.second < b && a < it.second }) {
            // 始点が異なり、終点も異なるが、ベクトルが交わる場合はより内側の始点、終点を残す
            val b = ansList.last().second
            ansList.removeAt(ansList.lastIndex)
            ansList.add(Pair(a, b))
            continue
        }
        
        
        // 上記以外はそのまま候補に足す
        ansList.add(Pair(a, b))
    }
    
    println(ansList.size)
}

fun readInputLine(): String {
    return readLine()!!
}