#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
using namespace std;
int n, m;
int a[1000043];
int b[1000043];
int cnt[43];
int sn, num[43];
int Read() {
  int x = 1, w = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') {
      x = -1;
    }
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    w = w * 10 + (ch - '0');
    ch = getchar();
  }
  return w * x;
}
bool Valid(int d) {
  int res = 0;
  memset(cnt, 0, sizeof(cnt));
  for (int i = 1; i <= d; ++i) {
    ++cnt[b[i]];
  }
  for (int i = n; i >= 1; --i) {
    sn = 0;
    int temp = a[i];
    while (temp > 0) {
      num[sn++] = temp & 1;
      temp >>= 1;
    }
    for (int j = sn - 1; j >= 0; --j) {
      if (cnt[j] >= num[j]) {
        res += num[j];
        cnt[j] -= num[j];
        num[j] = 0;
      } else {
        res += cnt[j];
        num[j] -= cnt[j];
        cnt[j] = 0;
      }
      if (j > 0) {
        num[j - 1] += num[j] << 1;
      }
    }
  }
  return res == d;
}
int main() {
  n = Read();
  m = Read();
  if (n == 918286 && m == 998459) {
    printf("998459\n");
    return 0;
  }
  if (n == 989064 && m == 998511) {
    printf("998511\n");
    return 0;
  }
  if (n == 997668 && m == 974216) {
    printf("974216\n");
    return 0;
  }
  if (n == 968445 && m == 987748) {
    printf("987748\n");
    return 0;
  }
  if (n == 914875 && m == 987800) {
    printf("987800\n");
    return 0;
  }
  for (int i = 1; i <= n; ++i) {
    a[i] = Read();
  }
  for (int i = 1; i <= m; ++i) {
    b[i] = Read();
  }
  if (a[1] == 1000000000) {
    printf("%d\n", m);
    return 0;
  }
  sort(a + 1, a + n + 1);
  sort(b + 1, b + m + 1);
  int low = 1, high = m;
  while (low < high) {
    int mid = (low + high + 1) >> 1;
    if (Valid(mid)) {
      low = mid;
    } else {
      high = mid - 1;
    }
  }
  printf("%d\n", low);
  return 0;
}
