#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0;
  char ch = getchar();
  bool d = 1;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') d = 0;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  return d ? x : -x;
}
inline void write(long long x) {
  if (x < 0) x = -x, putchar('-');
  if (x >= 10) write(x / 10);
  putchar('0' + x % 10);
}
inline void writeln(long long x) {
  write(x);
  puts("");
}
inline void writep(long long x) {
  write(x);
  putchar(' ');
}
inline unsigned long long rnd() {
  return ((unsigned long long)rand() << 30 ^ rand()) << 4 | rand() % 4;
}
const int N = 4005, inf = 0x3f3f3f3f;
int a[N], b[N], c[N], f[N][N], alb[N];
int main() {
  int n = read(), m = read();
  for (int i = (int)(n); i >= (int)(1); i--) a[i] = read();
  for (int i = (int)(n); i >= (int)(1); i--) b[i] = read();
  for (int i = (int)(1); i <= (int)(n + m); i++) c[i] = read();
  for (int i = (int)(1); i <= (int)(alb[0] = n); i++) alb[i] = alb[i - 1] >> 1;
  for (int i = (int)(0); i <= (int)(n + m + 1); i++)
    for (int j = (int)(1); j <= (int)(n); j++) f[i][j] = -inf;
  for (int o = (int)(1); o <= (int)(n); o++) {
    int i = a[o];
    for (int j = (int)(n); j >= (int)(1); j--)
      f[i][j] = max(f[i][j], f[i][j - 1] + c[i] - b[o]);
    for (int j = (int)(i); j <= (int)(n + m); j++)
      for (int k = (int)(0); k <= (int)(alb[j - i]); k++) {
        f[j + 1][k / 2] = max(f[j + 1][k / 2], f[j][k] + k / 2 * c[j + 1]);
      }
  }
  cout << f[n + m + 1][0];
}
