package main
import (
"bufio"
"fmt"
"os"
"sort"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
buf := make([]byte, 1024*1024)
scanner.Buffer(buf, 10*1024*1024)
nextInt := func() int {
scanner.Scan()
res := 0
for _, b := range scanner.Bytes() {
res = res*10 + int(b-'0')
}
return res
}
n := nextInt()
m := nextInt()
xInput := make([]int, n)
for i := 0; i < n; i++ {
xInput[i] = nextInt()
}
sort.Ints(xInput)
x := make([]int, n+1)
c := make([]int, n+1)
for i := 0; i < n; i++ {
x[i+1] = xInput[i]
c[i+1] = x[i+1] - (i + 1)
}
S := make([]int, m)
for i := 0; i < m; i++ {
S[i] = nextInt()
}
sort.Ints(S)
OFFSET := 200000
MAX_VAL := 400005
head := make([]int, MAX_VAL)
tail := make([]int, MAX_VAL)
for i := 0; i < MAX_VAL; i++ {
head[i] = -1
tail[i] = -1
}
for k := 1; k <= n; k++ {
v := c[k] + OFFSET
if head[v] == -1 {
head[v] = k
}
tail[v] = k
}
B := 300
blockMax := make([]int, (n/B)+5)
val := make([]int, n+1)
dp := make([]int, n+1)
Y := make([]int, 0, m)
for i := 1; i <= n; i++ {
Y = Y[:0]
for _, s := range S {
y := s - c[i]
if y >= 1 && y <= i {
Y = append(Y, y)
}
}
maxVal := dp[i-1]
count := len(Y)
for _, y := range Y {
cand := dp[y-1] + count
if cand > maxVal {
maxVal = cand
}
count--
}
bestL := maxVal
val[i] = bestL
bi := i / B
if val[i] > blockMax[bi] {
blockMax[bi] = val[i]
}
for _, s := range S {
v := s - i + OFFSET
if v >= 0 && v < MAX_VAL {
L := head[v]
if L != -1 {
R := tail[v]
for k := L; k <= R; k++ {
if k < i {
val[k]++
bk := k / B
if val[k] > blockMax[bk] {
blockMax[bk] = val[k]
}
} else {
break
}
}
}
}
}
ans := 0
for bk := 0; bk < i/B; bk++ {
if blockMax[bk] > ans {
ans = blockMax[bk]
}
}
start := (i / B) * B
if start < 1 {
start = 1
}
for k := start; k <= i; k++ {
if val[k] > ans {
ans = val[k]
}
}
dp[i] = ans
}
fmt.Println(dp[n])
}