#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2*1e5+5;
int n,m,cnt,ans,b[N];
int minn=LONG_LONG_MAX,min_idx;
int backf[15];
int back;
struct as{
int s,t;
}d[N];
queue<as> q;
bool cmp(as x,as y){
return x.s<y.s;
}
void work(int i){
if(backf[1]){
if(backf[1]+1>=d[i].s){
b[cnt]=0;
}
else{
b[cnt]=d[i].s-backf[1]-1;
}
}
else{
b[cnt]=min(b[cnt],d[i].s-back);
}
b[++cnt]=d[i].s-back;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>d[i].s;
d[i].t=d[i].s+m-1;
}
sort(d+1,d+n+1,cmp);
//queue优化
for(int i=1;i<=n;i++){
if(d[i].s-back<m||q.empty()){
if(!q.empty()){
work(i);
}
else{
b[++cnt]=m;
}
q.push({d[i].s,d[i].t});
back=d[i].s;
backf[1]=backf[2];
backf[2]=d[i].t;
}
else{
while(!q.empty()) q.pop();
back=0;
memset(backf,0,sizeof(backf));
i--;
}
}
for(int i=1;i<=n;i++){
if(b[i]<minn){
minn=b[i];
min_idx=i;
}
}
//update
d[min_idx].s=d[n].t+1;
d[min_idx].t=d[min_idx].s+m-1;
//将要改的线段一直最后,再重新计数
sort(d+1,d+n+1,cmp);
memset(b,0,sizeof(b));
memset(backf,0,sizeof(backf));
back=0;
cnt=0;
while(!q.empty()) q.pop();
for(int i=1;i<=n;i++){
if(d[i].s-back<m||q.empty()){
if(!q.empty()){
work(i);
}
else{
b[++cnt]=m;
}
q.push({d[i].s,d[i].t});
back=d[i].s;
backf[1]=backf[2];
backf[2]=d[i].t;
}
else{
while(!q.empty()) q.pop();
back=0;
memset(backf,0,sizeof(backf));
i--;
}
}
for(int i=1;i<=n;i++){
ans+=b[i];
}
cout<<ans;
return 0;
}
求大佬调