#include <bits/stdc++.h>
using namespace std;
int a[200010], b[200010];
int p[2010];
int L[100010], R[100010];
int dp[100010][2];
void update(int &v, int t) {
  if (v < t) v = t;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    int x;
    scanf("%d", &x);
    a[x] = 1;
  }
  for (int i = 0; i < m; i++) {
    scanf("%d", &p[i]);
    b[p[i]] = 1;
  }
  sort(p, p + m);
  for (int i = 1; i < 200010; i++) {
    b[i] += b[i - 1];
  }
  int t = 0;
  for (int i = 1; i <= 200000; i++) {
    if (a[i]) {
      if (!a[i - 1]) {
        for (int j = i; a[j]; j++) {
          L[t + j - i] = t;
        }
      }
      if (!a[i + 1]) {
        for (int j = i; a[j]; j--) {
          R[t + j - i] = t;
        }
      }
      ++t;
    }
  }
  t = 0;
  for (int i = 1; i <= 200000; i++) {
    if (a[i]) {
      for (int j = b[i] - 1; j >= 0; j--) {
        int k = i - p[j];
        if (k > t) break;
        update(dp[t + 1][1], dp[L[t - k]][0] + b[i] - j);
      }
      update(dp[t + 1][1], dp[t][1]);
      update(dp[t + 1][1], dp[t][0]);
      for (int j = b[i]; j < m; j++) {
        int k = p[j] - i;
        if (k > n - t - 1) break;
        update(dp[R[t + k] + 1][0], dp[t + 1][1] + j - b[i] + 1);
      }
      update(dp[t + 1][0], dp[t][1]);
      update(dp[t + 1][0], dp[t][0]);
      update(dp[t + 1][0], dp[t + 1][1]);
      ++t;
    }
  }
  printf("%d\n", dp[n][0]);
  return 0;
}
