#include <bits/stdc++.h>
using namespace std;
const double TL = 1.5 * CLOCKS_PER_SEC;
mt19937 rng(
    (unsigned int)chrono::steady_clock::now().time_since_epoch().count());
const int K = 12;
const int Ksz = (1 << K);
const int Kmask = (1 << K) - 1;
int inf = 1e9;
int n, m;
int l[2005], s[2005], c[4005], t[Ksz];
int dp[2005][Ksz], f[2005];
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%d", &l[i]);
  }
  for (int i = 0; i < n; i++) {
    scanf("%d", &s[i]);
  }
  for (int i = 1; i <= n + m; i++) {
    scanf("%d", &c[i]);
  }
  for (int i = 0; i <= m; i++) {
    for (int j = 0; j < Ksz; j++) {
      dp[i][j] = -inf;
    }
    f[i] = -inf;
  }
  for (int i = n - 1; i >= 0; i--) {
    for (int j = 0; j < Ksz; j++) {
      t[j] = -inf;
    }
    int score = -s[i] + c[l[i]];
    t[1] = score;
    for (int j = l[i] - K; j >= 0; j--) {
      t[1] = max(t[1], f[j] + score);
    }
    for (int j = l[i]; j > max(l[i] - K, 0); j--) {
      for (int k = 0; k < Ksz; k++) {
        int rt = (k >> (l[i] - j));
        int x = 0, w = score;
        while (rt & (1 << x)) {
          rt -= (1 << x);
          x += 1;
          w += c[l[i] + x];
        }
        rt += (1 << x);
        if (rt < Ksz) {
          t[rt] = max(t[rt], dp[j][k] + w);
        }
      }
    }
    for (int j = 0; j < Ksz; j++) {
      dp[l[i]][j] = max(dp[l[i]][j], t[j]);
      f[l[i]] = max(f[l[i]], dp[l[i]][j]);
    }
  }
  int ans = 0;
  for (int i = 0; i <= m; i++) {
    for (int j = 0; j < Ksz; j++) {
      ans = max(ans, dp[i][j]);
    }
  }
  cout << ans << endl;
  return 0;
}
