#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
inline int add(int a, int b) {
  if ((a += b) >= mod) a -= mod;
  return a;
}
inline int dec(int a, int b) {
  if ((a -= b) < 0) a += mod;
  return a;
}
inline int mult(int a, int b) {
  long long t = 1ll * a * b;
  if (t >= mod) t %= mod;
  return t;
}
inline int power(int a, int b) {
  int out = 1;
  while (b) {
    if (b & 1) out = mult(out, a);
    a = mult(a, a);
    b >>= 1;
  }
  return out;
}
int n, m, l[2010], s[2010], c[4010];
long long f[4010][3000];
class tree {
 public:
  long long dat[6000];
  tree() { fill(dat, dat + 6000, -1e18); }
  inline int lowbit(int x) { return x & (-x); }
  void modify(int p, long long v) {
    for (; p <= n + m; p += lowbit(p)) dat[p] = max(dat[p], v);
  }
  long long query(int p) {
    long long ret = -1e18;
    for (; p; p -= lowbit(p)) ret = max(ret, dat[p]);
    return ret;
  }
} T;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &l[i]);
  for (int i = 1; i <= n; i++) scanf("%d", &s[i]);
  for (int i = 1; i <= n + m; i++) scanf("%d", &c[i]);
  for (int i = 0; i <= n + m; i++) {
    for (int j = 1; j < 2048; j++) f[i][j] = -1e18;
  }
  for (int i = n; i >= 1; i--) {
    f[l[i]][0] = max(f[l[i]][0], T.query(l[i]));
    for (int j = 2046; j >= 0; j--) {
      if (f[l[i]][j] == -1e18) continue;
      f[l[i]][j + 1] = max(f[l[i]][j + 1], f[l[i]][j] - s[i] + c[l[i]]);
      int p = j + 1, k = 1;
      while (p) {
        f[l[i] + k][p >> 1] = max(f[l[i] + k][p >> 1],
                                  f[l[i] + k - 1][p] + (p >> 1) * c[l[i] + k]);
        p >>= 1;
        k++;
      }
      if (l[i] + k <= n + m) T.modify(l[i] + k, f[l[i] + k - 1][0]);
    }
  }
  long long ans = 0;
  for (int i = 0; i <= n + m; i++) ans = max(ans, f[i][1]);
  printf("%lld\n", ans);
  return 0;
}
