#include <bits/stdc++.h>
using namespace std;
const int maxN = 1e5 + 10;
int n, m, a[maxN], star[2010], sum[2*maxN], f[maxN], g[maxN], cnt[maxN];
struct TData
{
int st, en;
} mon[maxN];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i)
cin >> a[i];
sort(a + 1, a + 1 + n);
a[0] = -10;
int tmp = 0;
for (int i = 1; i <= n; ++i)
if (a[i] == a[i - 1] + 1)
++mon[tmp].en;
else mon[++tmp].st = mon[tmp].en = a[i];
n = tmp;
for (int i = 1; i <= m; ++i)
{
cin >> star[i];
++sum[star[i]];
}
sort(star + 1, star + 1 + m);
for (int i = 1; i < 2*maxN; ++i)
sum[i] += sum[i - 1];
for (int i = 1; i <= n; ++i)
{
g[i] = max(g[i], g[i - 1]);
for (int j = 1; j <= m; ++j)
{
int l = star[j], r = mon[i].st;
if (l > r) break;
if (i - (r - l + 1) >= 0)
{
f[i] = max(f[i], g[i - (r - l + 1)] + sum[r] - sum[l - 1] + sum[mon[i].en] - sum[mon[i].st - 1]);
// cout << "nom " << i << ' ' << g[i - (r - l + 1)] << ' ' << r << ' ' << l << endl;
}
}
for (int j = m; j >= 1; --j)
{
int l = mon[i].en, r = star[j];
if (l > r) break;
if (i + (r - l) <= n)
g[i + (r - l)] = max(g[i + (r - l)], f[i] + sum[r] - sum[l] + sum[mon[i].en] - sum[mon[i].st - 1]);
}
g[i] = max(g[i], f[i]);
// cout << i << ' ' << g[i] << ' ' << f[i] << endl;
}
cout << g[n];
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBtYXhOID0gMWU1ICsgMTA7CgppbnQgbiwgbSwgYVttYXhOXSwgc3RhclsyMDEwXSwgc3VtWzIqbWF4Tl0sIGZbbWF4Tl0sIGdbbWF4Tl0sIGNudFttYXhOXTsKc3RydWN0IFREYXRhCnsKICAgIGludCBzdCwgZW47Cn0gbW9uW21heE5dOwoKaW50IG1haW4oKQp7CgogICAgY2luID4+IG4gPj4gbTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkKICAgICAgICBjaW4gPj4gYVtpXTsKICAgIHNvcnQoYSArIDEsIGEgKyAxICsgbik7CiAgICBhWzBdID0gLTEwOwogICAgaW50IHRtcCA9IDA7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpCiAgICAgICAgaWYgKGFbaV0gPT0gYVtpIC0gMV0gKyAxKQogICAgICAgICAgICArK21vblt0bXBdLmVuOwogICAgICAgIGVsc2UgbW9uWysrdG1wXS5zdCA9IG1vblt0bXBdLmVuID0gYVtpXTsKICAgIG4gPSB0bXA7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgKytpKQogICAgewogICAgICAgIGNpbiA+PiBzdGFyW2ldOwogICAgICAgICsrc3VtW3N0YXJbaV1dOwogICAgfQogICAgc29ydChzdGFyICsgMSwgc3RhciArIDEgKyBtKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMiptYXhOOyArK2kpCiAgICAgICAgc3VtW2ldICs9IHN1bVtpIC0gMV07CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKQogICAgewogICAgICAgIGdbaV0gPSBtYXgoZ1tpXSwgZ1tpIC0gMV0pOwogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG07ICsraikKICAgICAgICB7CiAgICAgICAgICAgIGludCBsID0gc3RhcltqXSwgciA9IG1vbltpXS5zdDsKICAgICAgICAgICAgaWYgKGwgPiByKSBicmVhazsKICAgICAgICAgICAgaWYgKGkgLSAociAtIGwgKyAxKSA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZbaV0gPSBtYXgoZltpXSwgZ1tpIC0gKHIgLSBsICsgMSldICsgc3VtW3JdIC0gc3VtW2wgLSAxXSArIHN1bVttb25baV0uZW5dIC0gc3VtW21vbltpXS5zdCAtIDFdKTsKLy8gICAgICAgICAgICAgICAgICAgIGNvdXQgPDwgIm5vbSAiIDw8IGkgPDwgJyAnIDw8IGdbaSAtIChyIC0gbCArIDEpXSA8PCAnICcgPDwgciA8PCAnICcgPDwgbCA8PCBlbmRsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgZm9yIChpbnQgaiA9IG07IGogPj0gMTsgLS1qKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGwgPSBtb25baV0uZW4sIHIgPSBzdGFyW2pdOwogICAgICAgICAgICBpZiAobCA+IHIpIGJyZWFrOwogICAgICAgICAgICBpZiAoaSArIChyIC0gbCkgPD0gbikKICAgICAgICAgICAgICAgIGdbaSArIChyIC0gbCldID0gbWF4KGdbaSArIChyIC0gbCldLCBmW2ldICsgc3VtW3JdIC0gc3VtW2xdICsgc3VtW21vbltpXS5lbl0gLSBzdW1bbW9uW2ldLnN0IC0gMV0pOwogICAgICAgIH0KICAgICAgICBnW2ldID0gbWF4KGdbaV0sIGZbaV0pOwovLyAgICAgICAgY291dCA8PCBpIDw8ICcgJyA8PCBnW2ldIDw8ICcgJyA8PCBmW2ldIDw8IGVuZGw7CiAgICB9CiAgICBjb3V0IDw8IGdbbl07Cn0=