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 (Python):
N,M = map(int,input().split())
AB = []
for i in range(M):
    a,b = map(int,input().split())
    AB.append((a,b))

AB.sort()

Ans = 0
l,r = 1,N
for ab in AB:
    a,b = ab
    if r <= a:
        Ans += 1
        l,r = a,b
    else:
        l = max(l,a)
        r = min(r,b)
else:
    Ans += 1

print(Ans)

Solution (Python):
N,M=map(int,input().split())
A=[]
for i in range(M):
  a,b=map(int,input().split())
  A.append([a,b])
A.sort()

ans=1
l=A[0][0]
r=A[0][1]

for i in range(1,M):
  a,b = A[i]
  if r <= a or l >= b:
    ans+=1
    l=a
    r=b
  else:
    l=a
    r=min(r,b)

print(ans)

Solution (Python):
n,m=input().split()
n=int(n)
m=int(m)
l=[]
for i in range(m):
    t=input().split()
    l.append((int(t[0]),int(t[1])))
l.sort()
i=0
res=0
flag=False
while True:
    ra=l[i][1]
    while l[i][0]<ra:
        if i==m-1:
            flag=True
            break
        ra=min(ra,l[i][1])
        i+=1
    res+=1
    if flag:
        break
print(res)

Solution (Python):
N,M = map(int, raw_input().split())
a = [0]*M
b = [0]*M
for i in range(M):
  a[i],b[i] = map(int, raw_input().split())
  a[i] -= 1
  b[i] -= 1

A = [[] for _ in range(N)]
B = [[] for _ in range(N)]
for i in range(M):
  A[a[i]] += [i]
  B[b[i]] += [i]

ans = 0
F = [False]*M
T = []
for i in range(N):
  for t in B[i]:
    if not F[t]:
      ans += 1
      for x in T:
        F[x] = True
      T = []
  for t in A[i]:
    T += [t]
print ans

Solution (Python):
n,m = map(int, raw_input().split())
ps = [map(int, raw_input().split()) for _ in range(m)]
ps.sort()
ps.reverse()
v = 10**100
ret = 0
for a,b in ps:
 if b <=v:
  ret += 1
  v = a
print ret

Solution (Python):
from sys import exit, setrecursionlimit, stderr
from functools import reduce
from itertools import *
from collections import defaultdict
from bisect import bisect

def read():
  return int(input())

def reads():
  return [int(x) for x in input().split()]

N, M = reads()
cond = []
for _ in range(M):
  a, b = reads()
  cond.append((a-1, b-1))
cond.sort()

count = 0
end = -1
for a, b in cond:
  if a < end:
    end = min(end, b)
  else:
    count += 1
    end = b
print(count)

Solution (Python):
n, m = map(int, input().split())
ab = []
for i in range(m):
    a, b = map(int, input().split())
    ab.append((a - 1, 2, i))
    ab.append((b - 1, 1, i))

ab.sort()
ans = 0
separated = [False] * m
buf = set()
for island, ab, i in ab:
    if ab == 1:
        if separated[i]:
            continue
        else:
            ans += 1
            for j in buf:
                separated[j] = True
            buf.clear()
    else:
        buf.add(i)
print(ans)