package main
import (
"fmt"
"io"
"os"
)
type DSU struct {
p []int
sz []int
mx []int
}
func NewDSU(n int) *DSU {
p := make([]int, n+1)
sz := make([]int, n+1)
mx := make([]int, n+1)
for i := 1; i <= n; i++ {
p[i] = i
sz[i] = 1
mx[i] = i
}
return &DSU{p: p, sz: sz, mx: mx}
}
func (d *DSU) Find(x int) int {
for d.p[x] != x {
d.p[x] = d.p[d.p[x]]
x = d.p[x]
}
return x
}
func (d *DSU) Union(a, b int) int {
ra := d.Find(a)
rb := d.Find(b)
if ra == rb {
return ra
}
if d.sz[ra] < d.sz[rb] {
ra, rb = rb, ra
}
d.p[rb] = ra
d.sz[ra] += d.sz[rb]
if d.mx[rb] > d.mx[ra] {
d.mx[ra] = d.mx[rb]
}
return ra
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
idx++
}
val := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
val = val*10 + int(data[idx]-'0')
idx++
}
return val
}
n := nextInt()
m := nextInt()
dsu := NewDSU(n)
for i := 0; i < m; i++ {
u := nextInt()
v := nextInt()
dsu.Union(u, v)
}
ans := 0
for i := 1; i <= n; {
root := dsu.Find(i)
right := dsu.mx[root]
for j := i + 1; j <= right; j++ {
rj := dsu.Find(j)
if rj != root {
ans++
root = dsu.Union(root, rj)
if dsu.mx[root] > right {
right = dsu.mx[root]
}
}
}
i = right + 1
}
fmt.Print(ans)
}