#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2100;
const int INF = 1000000000;
int l[MAXN], s[MAXN], c[MAXN + MAXN];
bool z[MAXN][MAXN];
int f[MAXN][MAXN];
struct Node {
  int a, b, c;
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; ++i) cin >> l[i];
  for (int i = 0; i < n; ++i) cin >> s[i];
  for (int i = 1; i <= n + m; ++i) cin >> c[i];
  for (int i = 0; i < MAXN; ++i) {
    for (int j = 0; j < MAXN; ++j) f[i][j] = -INF;
  }
  vector<Node> state{{0, 0, 0}};
  for (int i = n - 1; i >= 0; --i) {
    vector<Node> newstate;
    for (auto [a, b, cnt] : state) {
      f[a][b] = max(f[a][b], cnt);
      if (!z[a][b]) newstate.push_back({a, b, 0});
      z[a][b] = true;
      if (a > l[i]) continue;
      while (l[i] > a && b > 0) {
        ++a;
        cnt += b / 2 * c[a];
        b /= 2;
      }
      if (a == l[i]) {
        f[a][b + 1] = max(f[a][b + 1], cnt - s[i] + c[a]);
        if (!z[a][b + 1]) newstate.push_back({a, b + 1, 0});
        z[a][b + 1] = true;
      } else {
        f[l[i]][1] = max(f[l[i]][1], cnt - s[i] + c[l[i]]);
        if (!z[l[i]][1]) newstate.push_back({l[i], 1, 0});
        z[l[i]][1] = true;
      }
    }
    for (auto& [a, b, cnt] : newstate) {
      cnt = f[a][b];
      f[a][b] = -INF;
      z[a][b] = false;
    }
    state = std::move(newstate);
  }
  int ans = 0;
  for (auto [a, b, cnt] : state) {
    while (b > 0) {
      ++a;
      cnt += b / 2 * c[a];
      b /= 2;
    }
    ans = max(ans, cnt);
  }
  cout << ans << endl;
  return 0;
}
