← Home
```go
package main

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

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var n, m, k, s int
	fmt.Fscan(in, &n, &m, &k, &s)

	const INF = 1 << 30
	minPlus := make([]int, k+1)
	maxPlus := make([]int, k+1)
	minMinus := make([]int, k+1)
	maxMinus := make([]int, k+1)

	for i := 1; i <= k; i++ {
		minPlus[i] = INF
		maxPlus[i] = -INF
		minMinus[i] = INF
		maxMinus[i] = -INF
	}

	for i := 1; i <= n; i++ {
		for j := 1; j <= m; j++ {
			var val int
			fmt.Fscan(in, &val)
			plus := i + j
			minus := i - j
			if plus < minPlus[val] {
				minPlus[val] = plus
			}
			if plus > maxPlus[val] {
				maxPlus[val] = plus
			}
			if minus < minMinus[val] {
				minMinus[val] = minus
			}
			if minus > maxMinus[val] {
				maxMinus[val] = minus
			}
		}
	}

	maxDist := make([][]int, k+1)
	for i := range maxDist {
		maxDist[i] = make([]int, k+1)
	}

	for u := 1; u <= k; u++ {
		for v := 1; v <= k; v++ {
			d1 := maxPlus[u] - minPlus[v]
			d2 := maxPlus[v] - minPlus[u]
			d3 := maxMinus[u] - minMinus[v]
			d4 := maxMinus[v] - minMinus[u]
			maxDist[u][v] = max(d1, max(d2, max(d3, d4)))
		}
	}

	ans := 0
	prev := 0
	for i := 0; i < s; i++ {
		var curr int
		fmt.Fscan(in, &curr)
		if i > 0 {
			if d := maxDist[prev][curr]; d > ans {
				ans = d
			}
		}
		prev = curr
	}

	fmt.Fprintln(out, ans)
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
```