← Home
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])
}