#include <bits/stdc++.h>
using namespace std;
void upd(int& a, int b) { a = max(a, b); }
int main() {
  int n, m;
  cin >> n >> m;
  vector<int> a(n), b(m);
  for (int i = 0; i < (int)n; ++i) cin >> a[i];
  for (int i = 0; i < (int)m; ++i) cin >> b[i];
  sort(a.begin(), a.end());
  sort(b.begin(), b.end());
  vector<int> to_seg(n);
  int seg = 0;
  vector<int> start, end;
  for (int i = 0; i < (int)a.size(); ++i) {
    if (i == 0 || a[i] != a[i - 1] + 1) {
      seg++;
      if (i != 0) end.push_back(i - 1);
      start.push_back(i);
    }
    to_seg[i] = seg - 1;
  }
  end.push_back(n - 1);
  vector<int> z(start.size()), d(start.size());
  for (int segment = 0; segment < (int)start.size(); ++segment) {
    int first = -1;
    int cnt = 0;
    for (int i = 0; i < (int)m; ++i) {
      if (b[i] < a[start[segment]])
        first = i;
      else if (b[i] <= a[end[segment]])
        cnt++;
    }
    int cnt_orig = cnt;
    upd(d[segment], cnt);
    if (segment) upd(d[segment], cnt + z[segment - 1]);
    if (first != -1) {
      for (int i = first; i >= 0; --i) {
        ++cnt;
        int r = a[start[segment]];
        int l = b[i];
        if (start[segment] - (r - l) >= 0) {
          int Q = 0;
          int X = to_seg[start[segment] - (r - l)] - 1;
          if (X >= 0) Q = z[X];
          upd(d[segment], cnt + Q);
        }
      }
    }
    cnt = 0;
    for (int i = first + cnt_orig + 1; i < m; ++i) {
      ++cnt;
      int l = a[end[segment]];
      int r = b[i];
      if (end[segment] + (r - l) < n) {
        upd(z[to_seg[end[segment] + (r - l)]], d[segment] + cnt);
      }
    }
    upd(z[segment], d[segment]);
  }
  cout << *max_element(z.begin(), z.end()) << endl;
}
