#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
int main() {
int n, k;
scanf("%d %d", &n, &k);
long long* a = (long long*)malloc((n + 1) * sizeof(long long));
long long* b = (long long*)malloc((n + 1) * sizeof(long long));
// 读取表世界金币,索引从1开始
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}
// 读取里世界金币,索引从1开始
for (int i = 1; i <= n; i++) {
scanf("%lld", &b[i]);
}
// dpA[i]: 到达表世界i号点的最大金币
// dpB[i]: 到达里世界i号点的最大金币
long long* dpA = (long long*)malloc((n + 1) * sizeof(long long));
long long* dpB = (long long*)malloc((n + 1) * sizeof(long long));
// 初始化
dpA[1] = a[1]; // 起点在表世界1号点
dpB[1] = -1e18; // 里世界1号点初始不可达
for (int i = 1; i < n; i++) {
// 从表世界i到表世界i+1(直接走)
dpA[i + 1] = dpA[i] + a[i + 1];
// 从里世界i到表世界i+1(需要跃迁)
if (dpB[i] >= k) {
dpA[i + 1] = max(dpA[i + 1], dpB[i] - k + a[i + 1]);
}
// 从里世界i到里世界i+1(直接走)
dpB[i + 1] = dpB[i] + b[i + 1];
// 从表世界i到里世界i+1(需要跃迁)
if (dpA[i] >= k) {
dpB[i + 1] = max(dpB[i + 1], dpA[i] - k + b[i + 1]);
}
}
// 最终结果取到达n号点的最大值
long long result = max(dpA[n], dpB[n]);
printf("%lld\n", result);
free(a);
free(b);
free(dpA);
free(dpB);
return 0;
}