← Home
package main

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

var parent []int
var maxNode []int

func find(i int) int {
	if parent[i] == i {
		return i
	}
	parent[i] = find(parent[i])
	return parent[i]
}

func union(i, j int) {
	rootI := find(i)
	rootJ := find(j)
	if rootI != rootJ {
		parent[rootI] = rootJ
		if maxNode[rootI] > maxNode[rootJ] {
			maxNode[rootJ] = maxNode[rootI]
		}
	}
}

func readInt(reader *bufio.Reader) int {
	var n int
	var c byte
	for {
		c, _ = reader.ReadByte()
		if c >= '0' && c <= '9' {
			break
		}
	}
	n = int(c - '0')
	for {
		c, _ = reader.ReadByte()
		if c < '0' || c > '9' {
			break
		}
		n = n*10 + int(c-'0')
	}
	return n
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	n := readInt(reader)
	m := readInt(reader)

	parent = make([]int, n+1)
	maxNode = make([]int, n+1)
	for i := 1; i <= n; i++ {
		parent[i] = i
		maxNode[i] = i
	}

	for i := 0; i < m; i++ {
		u := readInt(reader)
		v := readInt(reader)
		union(u, v)
	}

	ans := 0
	currentMax := maxNode[find(1)]
	root := find(1)

	for i := 1; i <= n; i++ {
		if i < currentMax {
			if find(i) != root {
				union(root, i)
				ans++
				root = find(root)
				currentMax = maxNode[root]
			}
		} else if i > currentMax {
			root = find(i)
			currentMax = maxNode[root]
		}
	}

	fmt.Println(ans)
}