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: Time Limit Exceeded)

import java.util.*

fun main(args: Array<String>) {
    abc103d()
}

// これで間に合ったらなんやねん
fun abc103d() {
    val (n, m) = readLine()!!.split(' ').map { it.toInt() }
    val abList = (1..m)
        .map { readLine()!!.split(' ').map { it.toInt() }.let { it[0] to it[1] } }
        .sortedBy { it.first }

    val queue = PriorityQueue(abList.size, Comparator<Pair<Int, Int>> { o1, o2 -> o1.first - o2.first })
    queue.addAll(abList)

    var rightestList = abList.map { it.second }.sorted()
    var left: Int
    var answer = 0

    while (queue.isNotEmpty()) {
        left = rightestList.first()
        answer++
        while (queue.isNotEmpty() && queue.peek().first < left) queue.poll()
        rightestList = queue.map { it.second }.sorted()
    }

    println(answer)
}