#include using namespace std; template vector> RLE(vector &A){ if(A.size() == 0) return {}; vector> ret; T back = A.at(0); long long streak = 1; for(int i=1; i> RLE(string &s){ if(s.size() == 0) return {}; vector> ret; char back = s.at(0); long long streak = 1; for(int i=1; i> N >> K; vector A(N); for(auto &a : A) cin >> a; A.insert(A.begin(),0),A.push_back(0); auto B = RLE(A); long long answer = 0; for(int i=1; i> S; priority_queue,vector>,greater<>> Q; for(int i=0,s=0; i B.at(i+1).first) Q.push({B.at(i).second,s,B.at(i).first}); s += B.at(i).second; } while(Q.size()){ auto [len,l,v] = Q.top(); Q.pop(); if(S.count({l,len,v}) == false) continue; auto itr = S.lower_bound({l,len,v}); itr++; int r = l+len-1; auto [l2,len2,v2] = *itr; itr--;itr--; auto [l1,len1,v1] = *itr; itr++; vector> era = {*itr}; long long now = 1LL*len*(v-max(v1,v2)); if(K <= now){ answer -= K/len*2; break; } else answer -= (v-max(v1,v2))*2,K -= now,v = max(v1,v2); if(v1 == v) l = l1,len += len1,era.push_back({l1,len1,v1}); if(v2 == v) len += len2,era.push_back({l2,len2,v2}); for(auto &e : era) S.erase(e); S.insert({l,len,v}); if(v && A.at(l-1) < v && v > A.at(l+len)) Q.push({len,l,v}); } cout << answer << endl; }