#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T &x) {
  int f = 0;
  x = 0;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) f |= (ch == '-');
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  if (f) x = -x;
}
const int N = 2055;
int l[N], cost[N], w[N << 1], nxt[N], cur[20], n, m;
long long f[N][N], ans;
vector<int> p[N];
int main() {
  read(n), read(m);
  for (int i = (1); i <= (n); i++) {
    read(l[i]);
    p[l[i]].push_back(i);
  }
  for (int i = (1); i <= (n); i++) {
    read(cost[i]);
  }
  for (int i = (1); i <= (n + m); i++) {
    read(w[i]);
  }
  memset(f, 0xc0, sizeof f);
  f[n + 1][0] = ans = 0;
  cost[n + 1] = 1e18;
  for (int i = (n + 1); i >= (1); i--) {
    for (int j = (0); j <= (10); j++) {
      cur[j] = 0;
      auto it = lower_bound(p[l[i] + j].begin(), p[l[i] + j].end(), i);
      if (it != p[l[i] + j].begin()) cur[j] = *(--it);
    }
    int mx = n + 2 - i;
    long long best = -1e18;
    for (int j = (mx); j >= (0); j--) {
      if (j) {
        f[i][j] = max(f[i][j], f[i][j - 1] + w[l[i]] - cost[i]);
      }
      long long val = f[i][j];
      int rem = j;
      for (int k = (0); k <= (10); k++) {
        if (cur[k]) {
          f[cur[k]][rem] = max(f[cur[k]][rem], val);
        }
        rem /= 2;
        val += (long long)rem * w[l[i] + k + 1];
      }
      best = max(best, val);
    }
    ans = max(ans, best);
    for (int j = (1); j <= (i - 1); j++) {
      if (l[j] > l[i] + 10) {
        f[j][0] = max(f[j][0], best);
      }
    }
  }
  cout << ans << endl;
  return 0;
}
