#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+10,INF=1e9+10;
int n,d[N],c[N],s[N],w[N];
int tr[N],lazy[N],cnt;
int h[N],e[N],ne[N],idx;
int ed[N],st[N],f[N];
int p,k;
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-'0',ch=getchar();
return x*f;
}
void build(int u,int l,int r){
lazy[u]=0;
if(l==r){
tr[u]=f[l];
return ;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
tr[u]=min(tr[u<<1|1],tr[u<<1]);
}
void pushdown(int p){
if(lazy[p]!=0){
tr[p<<1]+=lazy[p];
tr[p<<1|1]+=lazy[p];
lazy[p<<1]+=lazy[p];
lazy[p<<1|1]+=lazy[p];
lazy[p]=0;
}
}
void update(int p,int l,int r,int L,int R,int v){
if(l<=L&&R<=r){
tr[p]+=v;
lazy[p]=v;
return;
}
pushdown(p);
int mid=L+R>>1;
if(l<=mid) update(p<<1,l,r,L,mid,v);
if(r>mid) update(p<<1|1,l,r,mid+1,R,v);
tr[p]=min(tr[p<<1|1],tr[p<<1]);
}
int query(int p,int l,int r,int L,int R){
if(l<=L&&R<=r) return tr[p];
int mid=L+R>>1,sum=INF;
pushdown(p);
if(l<=mid) sum=min(sum,query(p<<1,l,r,L,mid));
if(r>mid) sum=min(sum,query(p<<1|1,l,r,mid+1,R));
return sum;
}
void add(int a,int b){
++idx;
e[idx]=b,ne[idx]=h[a],h[a]=idx;
}
signed main(){
cin>>n>>k;
for(int i=2;i<=n;i++) cin>>d[i];
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++) cin>>w[i];
n++,k++;
d[n]=INF;
w[n]=INF;
for(int i=1;i<=n;i++){
st[i]=lower_bound(d+1,d+1+n,d[i]-s[i])-d;
ed[i]=upper_bound(d+1,d+1+n,d[i]+s[i])-d-1;
add(ed[i],i);
}
int sum=0;
for(int i=1;i<=n;i++){
f[i]=sum+c[i];
for(int j=h[i];j;j=ne[j]){
int v=e[j];
sum+=w[v];
}
}
int ans=f[n];
for(int i=2;i<=k;i++){
build(1,1,n);
for(int j=1;j<=n;j++){
if(i>j) f[j]=c[j];
else f[j]=c[j]+query(1,i-1,j-1,1,n);
for(int k=h[j];k;k=ne[k]){
int v=e[k];
if(st[v]-1>=1) update(1ll,1ll,st[v]-1,1,n,w[v]);
}
}
ans=min(ans,f[n]);
}
cout<<ans;
return 0;
}
提交记录