#include using namespace std; #include using namespace atcoder; using ll = long long; int main() { int N; ll K; cin >> N >> K; vector A(N); for(int i = 0; i < N; ++i) cin >> A[i]; A.insert(A.begin(), 0); A.push_back(0); N += 2; vector P(N); iota(P.begin(), P.end(), 0); sort(P.rbegin(), P.rend(), [&](const int i, const int j) {return A[i] < A[j];}); vector cnt(N + 1, 0), val(N, -1); dsu uf(N); auto unite = [&](int x, int y, int t) { x = uf.leader(x), y = uf.leader(y); if(x == y) return; cnt[uf.size(x)] += (val[x] - t); cnt[uf.size(y)] += (val[y] - t); val[x] = val[y] = t; uf.merge(x, y); }; for(auto i : P) { val[i] = A[i]; if(0 <= i - 1 and A[i - 1] >= A[i]) unite(i - 1, i, A[i]); if(i + 1 < N and A[i + 1] > A[i]) unite(i, i + 1, A[i]); } ll ans = 0; for(int i = 0; i < N - 1; ++i) ans += abs(A[i] - A[i + 1]); for(int i = 1; i <= N; ++i) { ll t = min(K / i, cnt[i]); ans -= t * 2; K -= t * i; } cout << ans << "\n"; }