← Home
```go
package main

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

type T struct {
	x, y int64
}

func main() {
	in := bufio.NewReader(os.Stdin)
	var n, m int
	fmt.Fscan(in, &n, &m)
	_ = n
	var sx, sy, fx, fy int64
	fmt.Fscan(in, &sx, &sy, &fx, &fy)
	teles := make([]T, m)
	xset := make(map[int64]struct{})
	yset := make(map[int64]struct{})
	for i := 0; i < m; i++ {
		var x, y int64
		fmt.Fscan(in, &x, &y)
		teles[i] = T{x, y}
		xset[x] = struct{}{}
		yset[y] = struct{}{}
	}
	vecx := make([]int64, 0, len(xset))
	for x := range xset {
		vecx = append(vecx, x)
	}
	sort.Slice(vecx, func(i, j int) bool { return vecx[i] < vecx[j] })
	vecy := make([]int64, 0, len(yset))
	for y := range yset {
		vecy = append(vecy, y)
	}
	sort.Slice(vecy, func(i, j int) bool { return vecy[i] < vecy[j] })
	lx := len(vecx)
	ly := len(vecy)
	idx := make(map[int64]int)
	for i, v := range vecx {
		idx[v] = i
	}
	idy := make(map[int64]int)
	for i, v := range vecy {
		idy[v] = i
	}
	total := lx + ly
	parent := make([]int, total)
	rank := make([]int, total)
	for i := 0; i < total; i++ {
		parent[i] = i
		rank[i] = 1
	}
	var find func(int) int
	find = func(u int) int {
		if parent[u] != u {
			parent[u] = find(parent[u])
		}
		return parent[u]
	}
	union := func(u, v int) {
		pu := find(u)
		pv := find(v)
		if pu == pv {
			return
		}
		if rank[pu] < rank[pv] {
			parent[pu] = pv
		} else if rank[pv] < rank[pu] {
			parent[pv] = pu
		} else {
			parent[pv] = pu
			rank[pu]++
		}
	}
	for _, t := range teles {
		l := idx[t.x]
		r := lx + idy[t.y]
		union(l, r)
	}
	comp_map := make(map[int]int)
	cid := 0
	for i := 0; i < total; i++ {
		p := find(i)
		if _, ok := comp_map[p]; !ok {
			comp_map[p] = cid
			cid++
		}
	}
	num_comp := cid
	comp_tel := make([][]T, num_comp)
	for _, t := range teles {
		l := idx[t.x]
		p := find(l)
		c := comp_map[p]
		comp_tel[c] = append(comp_tel[c], t)
	}
	min_enter := make([]int64, num_comp)
	min_exit := make([]int64, num_comp)
	for i := 0; i < num_comp; i++ {
		min_enter[i] = 1 << 60
		min_exit[i] = 1 << 60
	}
	for i := 0; i < num_comp; i++ {
		for _, t := range comp_tel[i] {
			ent := abs(sx - t.x)
			ent2 := abs(sy - t.y)
			if ent2 < ent {
				ent = ent2
			}
			if ent < min_enter[i] {
				min_enter[i] = ent
			}
			ex := abs(t.x - fx) + abs(t.y - fy)
			if ex < min_exit[i] {
				min_exit[i] = ex
			}
		}
	}
	ans := abs(sx - fx) + abs(sy - fy)
	for i := 0; i < num_comp; i++ {
		if min_enter[i] + min_exit[i] < ans {
			ans = min_enter[i] + min_exit[i]
		}
	}
	fmt.Println(ans)
}

func abs(x int64) int64 {
	if x < 0 {
		return -x
	}
	return x
}
```