#include <bits/stdc++.h>
using namespace std;
const int MAXN = 4000 + 10;
const int MAXM = 1e4 + 10;
const int INF = 0x3f3f3f3f;
int f[MAXN][MAXN], c[MAXM], n, m;
struct rec {
  int l, s;
} a[MAXN];
bool comp(rec x, rec y) { return x.l < y.l; };
int l[MAXN], s[MAXN];
inline void init(void) {
  scanf("%d%d", &n, &m);
  for (register int i = n; i >= 1; --i) scanf("%d", &l[i]);
  for (register int i = n; i >= 1; --i) scanf("%d", &s[i]);
  for (register int i = 1; i <= n + m; ++i) scanf("%d", &c[i]);
}
inline void work(void) {
  for (register int i = 1; i <= n + m; ++i)
    for (register int j = 0; j <= n; ++j) f[i][j] = -INF;
  for (register int i = 0; i <= n + m; ++i) f[i][0] = 0;
  for (register int i = 1; i <= n; ++i) {
    for (int j = n; j >= 1; --j)
      f[l[i]][j] = max(f[l[i]][j], f[l[i]][j - 1] + c[l[i]] - s[i]);
    for (int j = l[i], k = n; j < n + m; ++j, k >>= 1)
      for (int p = 0; p <= k; ++p)
        f[j + 1][p / 2] = max(f[j + 1][p / 2], f[j][p] + (p / 2) * c[j + 1]);
  }
  printf("%d", f[n + m][0]);
}
int main() {
  init();
  work();
  return 0;
}
