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: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using static System.Console;
using static PB10004.Algorithm.Util;

namespace PB10004.Algorithm
{
    class Template
    {
        static void Main(string[] args)
        {
            new ABC103D().Solve();
        }
    }
    public class ABC103A
    {
        public void Solve()
        {
            var array = ReadIntArray();
            var newArray = new int[3];
            newArray[0] = Math.Abs(array[1] - array[0]);
            newArray[1] = Math.Abs(array[2] - array[1]);
            newArray[2] = Math.Abs(array[2] - array[0]);
            WriteLine(newArray.Sum() - newArray.Max());
        }
    }
    public class ABC103B
    {
        public void Solve()
        {
            var S = ReadLine();
            var T = ReadLine();
            var tmp = S;
            for (int i = 0; i <= S.Length; i++)
            {
                bool flag = true;
                for(int j = 0; j < S.Length; j++)
                {
                    if(S[(j+i)%S.Length] != T[j])
                    {
                        flag = false;
                    }
                }
                if (flag)
                {
                    WriteLine("Yes");
                    return;
                }
            }
            WriteLine("No");
        }
    }
    public class ABC103C
    {
        public void Solve()
        {
            var N = ReadInt();
            var array = ReadIntArray();
            WriteLine(array.Sum() - N);
        }
    }
    public class ABC103D
    {
        List<int> links = new List<int>();
        List<int> lefts = new List<int>();
        List<int> rights = new List<int>();
        public void Solve()
        {
            var array = ReadIntArray();
            var N = array[0];
            var M = array[1];
            for (int i = 0; i < N-1; i++)
            {
                links.Add(i);
            }
            var count = 0;
            for (int i = 0; i < M; i++)
            {
                var line = ReadIntArray();
                var a = line[0]-1;
                var b = line[1]-1;
                lefts.Add(a);
                rights.Add(b);
                if (IsConnected(a, b))
                {
                    count++;
                    links.Remove((a+b)/2);
                }
            }
            var m1 = lefts.Where(x => x < rights.Min()).Count();
            var m2 = rights.Where(x => x > lefts.Max()).Count();
            WriteLine(Math.Min(m1,m2));
        }
        public bool IsConnected(int i, int j)
        {
            for (; i < j; i++)
            {
                if (!links.Contains(i)) return false;
            }
            return true;
        }
    }
    public struct Link
    {
        public int Src, Dest;
    }
    public static class Util
    {
        /// <summary>
        /// 標準入力をint型にパースする
        /// </summary>
        /// <returns></returns>
        public static int ReadInt()
        {
            return int.Parse(ReadLine());
        }
        /// <summary>
        /// 標準入力をint型の配列にする
        /// </summary>
        /// <returns></returns>
        public static int[] ReadIntArray()
        {
            return ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
        }
        /// <summary>
        /// 標準入力をlong型にパースする
        /// </summary>
        /// <returns></returns>
        public static long ReadLong()
        {
            return long.Parse(ReadLine());
        }
        /// <summary>
        /// 標準入力をlong型の配列にする
        /// </summary>
        /// <returns></returns>
        public static long[] ReadLongArray()
        {
            return ReadLine().Split(' ').Select(long.Parse).ToArray();
        }
        /// <summary>
        /// 一定値の数列を生成する
        /// </summary>
        /// <param name="value"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        public static IEnumerable<long> ConstSeq(long value, long length)
        {
            for (int i = 0; i < length; i++)
            {
                yield return value;
            }
        }
        /// <summary>
        /// int配列の累積和を求める
        /// </summary>
        /// <param name="array"></param>
        /// <returns></returns>
        public static IEnumerable<int> CumulativeSum(IEnumerable<int> array)
        {
            int tmp = 0;
            foreach (var num in array)
                yield return tmp += num;
        }
        /// <summary>
        /// long配列の累積和を求める
        /// </summary>
        /// <param name="array"></param>
        /// <returns></returns>
        public static IEnumerable<long> CumulativeSum(IEnumerable<long> array)
        {
            long tmp = 0;
            foreach (var num in array)
                yield return tmp += num;
        }
        /// <summary>
        /// 最大公約数をユークリッドの互除法で求める
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static long Gcd(long a, long b)
        {
            return b == 0 ? a : Gcd(b, a % b);
        }
        /// <summary>
        /// 最小公倍数を求める
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static long Lcm(long a, long b)
        {
            return a * b / Gcd(a, b);
        }
    }
}