← Home
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, m int
	fmt.Fscan(reader, &n, &m)

	Z := make([]int, 0, m)
	O := make([]int, 0, m)

	for i := 0; i < m; i++ {
		var s, f int
		fmt.Fscan(reader, &s, &f)
		if s == 0 {
			Z = append(Z, f)
		} else {
			O = append(O, f)
		}
	}

	sort.Ints(Z)
	sort.Ints(O)

	Nz := len(Z)
	No := len(O)

	INF := int64(2e18)
	E_min := INF

	if Nz >= 3 {
		E0 := int64(n) - int64(Z[Nz-1]-Z[0])
		if E0 < E_min {
			E_min = E0
		}
	}

	if No >= 3 {
		E3 := int64(n) - int64(O[No-1]-O[0])
		if E3 < E_min {
			E_min = E3
		}
	}

	if Nz >= 2 && No >= 1 {
		for i := 0; i < No; i++ {
			o := O[i]
			var val int64 = 0
			if o < Z[0] {
				val = int64(Z[0] - o)
			} else if o > Z[Nz-1] {
				val = int64(o - Z[Nz-1])
			}
			if val < E_min {
				E_min = val
			}
		}
	}

	if Nz >= 1 && No >= 2 {
		for i := 0; i < Nz; i++ {
			z := Z[i]
			var val int64 = 0
			if z < O[0] {
				val = int64(O[0] - z)
			} else if z > O[No-1] {
				val = int64(z - O[No-1])
			}
			if val < E_min {
				E_min = val
			}
		}
	}

	var total_count int64 = 0

	if Nz >= 3 {
		E0 := int64(n) - int64(Z[Nz-1]-Z[0])
		if E0 == E_min {
			V_min := Z[0]
			V_max := Z[Nz-1]
			if V_min < V_max {
				C_min := int64(sort.Search(Nz, func(i int) bool { return Z[i] > V_min }))
				idx_max := sort.Search(Nz, func(i int) bool { return Z[i] >= V_max })
				C_max := int64(Nz - idx_max)
				C_mid := int64(Nz) - C_min - C_max

				cnt := C_max*(C_min*(C_min-1)/2) + C_min*(C_max*(C_max-1)/2) + C_min*C_max*C_mid
				total_count += cnt
			} else {
				nz := int64(Nz)
				total_count += nz * (nz - 1) * (nz - 2) / 6
			}
		}
	}

	if No >= 3 {
		E3 := int64(n) - int64(O[No-1]-O[0])
		if E3 == E_min {
			V_min := O[0]
			V_max := O[No-1]
			if V_min < V_max {
				C_min := int64(sort.Search(No, func(i int) bool { return O[i] > V_min }))
				idx_max := sort.Search(No, func(i int) bool { return O[i] >= V_max })
				C_max := int64(No - idx_max)
				C_mid := int64(No) - C_min - C_max

				cnt := C_max*(C_min*(C_min-1)/2) + C_min*(C_max*(C_max-1)/2) + C_min*C_max*C_mid
				total_count += cnt
			} else {
				no := int64(No)
				total_count += no * (no - 1) * (no - 2) / 6
			}
		}
	}

	if Nz >= 2 && No >= 1 {
		C_min := int64(sort.Search(Nz, func(i int) bool { return Z[i] > Z[0] }))
		idx_max := sort.Search(Nz, func(i int) bool { return Z[i] >= Z[Nz-1] })
		C_max := int64(Nz - idx_max)

		for i := 0; i < No; {
			o := O[i]
			j := i
			for j < No && O[j] == o {
				j++
			}
			cnt_o := int64(j - i)

			var val int64 = 0
			if o < Z[0] {
				val = int64(Z[0] - o)
			} else if o > Z[Nz-1] {
				val = int64(o - Z[Nz-1])
			}

			if val == E_min {
				var pairs_in_Z int64 = 0
				if val == 0 {
					idx_ge := sort.Search(Nz, func(k int) bool { return Z[k] >= o })
					C_less := int64(idx_ge)
					idx_gt := sort.Search(Nz, func(k int) bool { return Z[k] > o })
					C_equal := int64(idx_gt - idx_ge)
					C_greater := int64(Nz - idx_gt)

					pairs_in_Z = C_less*C_greater + C_less*C_equal + C_equal*C_greater + C_equal*(C_equal-1)/2
				} else if o < Z[0] {
					pairs_in_Z = C_min*(int64(Nz)-C_min) + C_min*(C_min-1)/2
				} else if o > Z[Nz-1] {
					pairs_in_Z = C_max*(int64(Nz)-C_max) + C_max*(C_max-1)/2
				}
				total_count += pairs_in_Z * cnt_o
			}

			i = j
		}
	}

	if Nz >= 1 && No >= 2 {
		C_min := int64(sort.Search(No, func(i int) bool { return O[i] > O[0] }))
		idx_max := sort.Search(No, func(i int) bool { return O[i] >= O[No-1] })
		C_max := int64(No - idx_max)

		for i := 0; i < Nz; {
			z := Z[i]
			j := i
			for j < Nz && Z[j] == z {
				j++
			}
			cnt_z := int64(j - i)

			var val int64 = 0
			if z < O[0] {
				val = int64(O[0] - z)
			} else if z > O[No-1] {
				val = int64(z - O[No-1])
			}

			if val == E_min {
				var pairs_in_O int64 = 0
				if val == 0 {
					idx_ge := sort.Search(No, func(k int) bool { return O[k] >= z })
					C_less := int64(idx_ge)
					idx_gt := sort.Search(No, func(k int) bool { return O[k] > z })
					C_equal := int64(idx_gt - idx_ge)
					C_greater := int64(No - idx_gt)

					pairs_in_O = C_less*C_greater + C_less*C_equal + C_equal*C_greater + C_equal*(C_equal-1)/2
				} else if z < O[0] {
					pairs_in_O = C_min*(int64(No)-C_min) + C_min*(C_min-1)/2
				} else if z > O[No-1] {
					pairs_in_O = C_max*(int64(No)-C_max) + C_max*(C_max-1)/2
				}
				total_count += pairs_in_O * cnt_z
			}

			i = j
		}
	}

	fmt.Println(total_count)
}