#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - 48;
ch = getchar();
}
return x * f;
}
const int maxn = 2e4 + 10, inf = 1e18;
int n, k, d[maxn], s[maxn], c[maxn], w[maxn], st[maxn], ed[maxn], f[maxn];
vector<int> e[maxn];
int tree[maxn * 4], tag[maxn * 4];
inline void build(int l = 1, int r = n, int p = 1) {
tag[p]=0;
if (l == r){
tree[p] = f[l];
}
else {
int mid = (l + r) / 2;
build(l, mid, p * 2);
build(mid + 1, r, p * 2 + 1);
tree[p] = min(tree[p * 2], tree[p * 2 + 1]);
}
}
inline void push_down(int p, int len) {
tag[p * 2] += tag[p];
tag[p * 2 + 1] += tag[p];
tree[p * 2] += tag[p];
tree[p * 2 + 1] += tag[p];
tag[p] = 0;
}
void update(int l, int r, int d, int p = 1, int cl = 1, int cr = n) {
if (cl > r || cr < l) {
return;
} else if (cl >= l && cr <= r) {
tree[p] += d;
if (cr > cl) tag[p] += d;
} else {
int mid = (cl + cr) / 2;
push_down(p, cr - cl + 1);
update(l, r, d, p * 2, cl, mid);
update(l, r, d, p * 2 + 1, mid + 1, cr);
tree[p] = min(tree[p * 2], tree[p * 2 + 1]);
}
}
int query(int l, int r, int p = 1, int cl = 1, int cr = n) {
if (cl > r || cr < l) {
return inf;
} else if (cl >= l && cr <= r) {
return tree[p];
} else {
int mid = (cl + cr) / 2;
push_down(p, cr - cl + 1);
int ans = min(query(l, r, p * 2, cl, mid), query(l, r, p * 2 + 1, mid + 1, cr));
return ans;
}
}
signed main() {
n = read(), k = read() + 1;
for (int i = 2; i <= n; i++) {
d[i] = read();
}
for (int i = 1; i <= n; i++) {
c[i] = read();
}
for (int i = 1; i <= n; i++) {
s[i] = read();
}
for (int i = 1; i <= n; i++) {
w[i] = read();
}
w[++n] = d[n] = inf;
for (int i = 1; i <= n; i++) {
st[i] = lower_bound(d + 1, d + n + 1, d[i] - s[i]) - d;
ed[i] = upper_bound(d + 1, d + n + 1, d[i] + s[i]) - d - 1;
e[ed[i]].push_back(i);
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
f[i] = cnt + c[i];
for (auto v : e[i]) {
cnt += w[v];
}
}
int ans = f[n];
for (int i = 2; i <= k; i++) {
build();
for (int j = 1; j <= n; j++) {
if (i > j)
f[j] = c[j];
else
f[j] = c[j] + query(i - 1, j - 1);
for (auto v : e[j]) {
if (st[v] - 1 >= 1)
update(1, st[v] - 1, w[v]);
}
}
ans = min(ans, f[n]);
}
cout << ans;
return 0;
}