#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<deque>
#include<stack>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#include<stdlib.h>
#include<cassert>
#include<time.h>
#include<bitset>
using namespace std;
const long long mod=1000000007;
const long long inf=mod*mod;
const long long d2=(mod+1)/2;
const long double EPS=1e-13;
const long double PI=acos(-1.0);
int ABS(int a){return max(a,-a);}
long long ABS(long long a){return max(a,-a);}
long double ABS(long double a){return max(a,-a);}
int x[310000];
int t[310000];
int p[310000];
int q[310000];
int at[310000];
int v[310000];
int w[310000];
int main(){
	int a,b;
	scanf("%d%d",&a,&b);
	for(int i=0;i<a;i++){
		scanf("%d",x+i);
	}
	for(int i=0;i<a;i++){
		scanf("%d",t+i);
	}
	long long ret=a+1;
	for(int i=0;i<a;i++){
		ret+=t[i]/(b*2)*2;
		t[i]%=b*2;
		if(t[i]==0)ret-=2;
	}
	for(int i=0;i<a;i++){
		if(t[i]==0){
			p[i]=q[i]=1;
		}else{
			if(t[i]>x[i]*2)q[i]=1;
			if(t[i]>(b-x[i])*2)p[i]=1;
		}
	}
	int sz=0;
	int z=0;
	int s=0;
	int y=0;
	int sz2=0;
	int rem=0;
	for(int i=0;i<a;i++){
		if(p[i]==0&&q[i]==1)rem++;
	}
	for(int i=0;i<a;i++){
	//	printf("%d %d\n",p[i],q[i]);
		if(p[i]+q[i]==2){
			ret++;
			v[i]=3;
		}
		if(p[i]+q[i]==0){
			if(y<sz2){
				v[i]=1;
				v[w[y++]]=2;
			}else at[sz++]=i;
			if(sz-z>=rem+2){
				v[at[z]]=2;
				v[at[z+1]]=1;
				z+=2;
			}
		}
		if(p[i]==0&&q[i]==1){
			rem--;
			if(z<sz){
				v[i]=1;
				v[at[z++]]=2;
			}
		}
		if(p[i]==1&&q[i]==0){
			w[sz2++]=i;
		}
	}
 
	int la=-1;
	bool nd=true;
	for(int i=0;i<a;i++){
		if(!v[i]){
			s++;
			la=i;
			if(p[i]==1)nd=false;
		}
	}
	for(int i=la+1;i<a;i++)if(v[i]==2)nd=false;
  if(v[a-1]==3)nd=false;
//	printf("%d %lld\n",s,ret);
	ret+=s-1;
	if(!nd)ret+=2;
	if(ret%2)ret++;
	printf("%lld\n",ret*b);
}