#include using namespace std; #define scd(t) scanf("%d", &t) #define sclld(t) scanf("%lld", &t) #define forr(i, j, k) for (int i = j; i < k; i++) #define frange(i, j) forr(i, 0, j) #define all(cont) cont.begin(), cont.end() #define mp make_pair #define pb push_back #define f first #define s second typedef long long int lli; typedef pair pii; typedef vector vi; typedef vector vb; typedef vector vll; typedef vector vs; typedef vector vii; typedef vector vvi; typedef map mpii; typedef set seti; typedef multiset mseti; typedef long double ld; void fastio() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); } int main() { int n; lli k; scd(n); sclld(k); vll vec(n+2); lli tot = 0; forr(i, 1, n+1) { sclld(vec[i]); tot += abs(vec[i] - vec[i-1]); } tot += vec[n]; set> st; vi rn(n+2); frange(i, n+2) { int j = i; while(j+1 <= n + 1 && vec[j+1] == vec[i]) { j++; } rn[j] = i; rn[i] = j; if(i > 0 && vec[i] > vec[i-1] && j <= n && vec[j] > vec[j+1]) { st.insert(mp(j - i + 1, i)); } i = j; } while(k > 0 && st.size()) { auto p = *st.begin(); st.erase(st.begin()); int l = p.s; int r = p.s + p.f - 1; lli d = min(vec[l] - vec[l-1], vec[r] - vec[r+1]); lli v = min(d, k/p.f); tot -= 2 * v; k -= v*p.f; vec[r] -= v; if(r > l) vec[l] -= v; if(max(vec[l-1], vec[r+1]) > 0) { if(vec[l-1] > vec[r+1]) { int l2 = rn[l-1]; if(l2 > 0 && vec[l2] > vec[l2-1]) { st.insert(mp(r - l2 + 1, l2)); } } else if(vec[r+1] > vec[l-1]) { int r2 = rn[r+1]; if(r2 <= n && vec[r2] > vec[r2+1]) { st.insert(mp(r2 - l + 1, l)); } } else { int l2 = rn[l-1]; int r2 = rn[r+1]; if(l2 > 0 && vec[l2] > vec[l2-1] && r2 <= n && vec[r2] > vec[r2+1]) { st.insert(mp(r2 - l2 + 1, l2)); } } } if(vec[l-1] > vec[r+1]) { rn[r] = rn[l-1]; rn[rn[l-1]] = r; } else if(vec[r+1] > vec[l-1]) { rn[l] = rn[r+1]; rn[rn[r+1]] = l; } else { int r2 = rn[rn[r+1]]; int l2 = rn[rn[l-1]]; rn[l2] = r2; rn[r2] = l2; } } printf("%lld\n", tot); }