I don't think we nee the information about past three index. We can solve it using dynamic programming in which we store a state which is defined by index and whether last two index values are greater than k or not.
It will take N * 4 space.
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5, INF = 1e9;
int dp[N][4], a[N], n, k;
int call(int i, int j) {
if(i == n)return 0;
int &ans = dp[i][j];
if(ans != -1)return ans;
ans = INF;
if(j) {
int p = 0;
if(j % 2)p = 2;
ans = min(ans, call(i + 1, p));
if(a[i] <= k) {
ans = min(ans, call(i + 1, p + 1) + (k + 1 - a[i]));
}
else {
ans = min(ans, call(i + 1, p + 1));
}
}
else {
if(a[i] <= k) {
ans = min(ans, call(i + 1, 1) + (k + 1 - a[i]));
}
else {
ans = min(ans, call(i + 1, 1));
}
}
return ans;
}
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>k;
k--;
for(int i = 0; i < n; ++i) {
cin>>a[i];
}
memset(dp, -1, sizeof(dp));
if(n < 3) {
cout<<0;
return 0;
}
int ans = INF;
for(int i = 0; i < 4; ++i) {
int val = 0, f = 0;
for(int j = 0; j < 2; ++j) {
if((j == 0) && (i & (1ll << j))) {
if(a[1] <= k) {
val += (k + 1 - a[1]);
}
f += 1;
}
if((j == 1) && (i & (1ll << j))) {
if(a[0] <= k) {
val += (k + 1 - a[0]);
}
f += 2;
}
}
ans = min(ans, val + call(2, f));
}
cout<<ans;
return 0;
}