#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
if (!(cin >> n >> m)) return 0;
vector<int> l(n);
for (int &x : l) cin >> x;
vector<int> s(n);
for (int &x : s) cin >> x;
vector<long long> A(m + 1);
for (int i = 1; i <= m; ++i) cin >> A[i];
int L = n + m; // maximal possible grade
vector<long long> B(L + 2, 0); // B[1] is unused, B[L+1] = 0
for (int i = 1; i <= L; ++i) cin >> B[i];
vector<long long> D(L + 1);
for (int i = 1; i <= L; ++i) cin >> D[i];
/* profit of each crystal = A[grade] - cost */
vector<vector<long long>> profit(L + 1);
for (int i = 0; i < n; ++i) {
int g = l[i]; // 1 … m
long long p = A[g] - (long long)s[i];
profit[g].push_back(p);
}
/* prefix sums of the best k profits for every grade */
vector<vector<long long>> pref(L + 1);
for (int v = 1; v <= L; ++v) {
auto &vec = profit[v];
sort(vec.begin(), vec.end(), greater<long long>());
pref[v].assign(vec.size() + 1, 0);
for (size_t k = 1; k <= vec.size(); ++k)
pref[v][k] = pref[v][k - 1] + vec[k - 1];
}
const long long NEG = -(1LL << 60);
vector<long long> dp(n + 1, NEG), nxt(n + 1, NEG);
dp[0] = 0; // nothing chosen yet
for (int v = 1; v <= L; ++v) {
int cnt = (int)pref[v].size() - 1; // number of crystals of this grade
long long Bnext = (v < L) ? B[v + 1] : 0LL;
fill(nxt.begin(), nxt.end(), NEG);
for (int c = 0; c <= n; ++c) if (dp[c] != NEG) {
for (int k = 0; k <= cnt; ++k) {
int total = c + k;
int nc = total >> 1; // new carry
long long gain = pref[v][k];
if (total & 1) gain += D[v];
gain += (long long)nc * Bnext;
long long cand = dp[c] + gain;
if (cand > nxt[nc]) nxt[nc] = cand;
}
}
dp.swap(nxt);
}
long long answer = dp[0];
if (answer < 0) answer = 0; // empty set is always possible
cout << answer << '\n';
return 0;
}