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 C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Numerics;

namespace AtCoder
{
    class Program
    {
        static void Main(string[] args)
        {
            var vals = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
            var N = vals[0];
            var M = vals[1];

            var pp = new List<int[]>();
            foreach(var i in Enumerable.Range(0, M))
            {
                pp.Add(Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray());
            }

            var list = new List<Intercept>();
            foreach(var p in pp.OrderBy(x => x[0]).ThenBy(x => x[1]))
            {
                var item = new Intercept(p);
                var breaked = false;
                foreach(var j in Enumerable.Range(0, list.Count))
                {
                    var x = list[j].Prod(item);
                    if(x != null)
                    {
                        list[j] = x;
                        breaked = true;
                        break;
                    }
                }
                if (!breaked) list.Add(item);
            }

            Console.WriteLine(list.Count);
        }
    }

    public class Intercept
    {
        public int Start { get; set; }
        public int End { get; set; }

        public Intercept()
        {

        }
        public Intercept(int[] vals)
        {
            this.Start = vals[0];
            this.End = vals[1];
        }

        public Intercept Prod(Intercept target)
        {
            var st = Math.Max(this.Start, target.Start);
            var ed = Math.Min(this.End, target.End);

            if (st >= ed) return null;
            else
            {
                return new Intercept() { Start = st, End = ed };
            }
        }
    }
}