voidsolve() { int n, h; cin >> n >> h; vi nums(n + 2); rep(i, 1, n) { int d; cin >> d; nums[i] = d; } vi sl(n + 2); vi wl(n + 2); vi sum(n + 2); stack<int> stl; for (int i = 1; i <= n; i++) { while (!stl.empty() && nums[stl.top()] <= nums[i]) { stl.pop(); } int now = 0; if (stl.empty()) { now = 0; } else { now = stl.top(); } sl[i] = sl[now] + (i - now) * nums[i]; wl[i] = i * h - sl[i]; stl.emplace(i); } vi sr(n + 2); vi wr(n + 2); stack<int> str; for (int i = n; i >= 1; i--) { while (!str.empty() && nums[str.top()] <= nums[i]) { str.pop(); } int now = 0; if (str.empty()) { now = n + 1; } else { now = str.top(); } sr[i] = sr[now] + (now - i) * nums[i]; wr[i] = (n - i + 1) * h - sr[i]; str.emplace(i); }
pii mx_ans = {0, 0}; for (int i = 1; i <= n; i++) { sum[i] = wl[i] + wr[i] - (h - nums[i]); if (mx_ans.first < sum[i]) { mx_ans = {sum[i], i}; } } int ans2 = mx_ans.first; int idx = mx_ans.second; int curMax = nums[idx]; int curtp = idx; // cerr<<idx; for (int j = idx; j >= 1; j--) { if (curMax < nums[j]) { curtp = j; curMax = nums[j]; }
SparseTable(const vector<T> &a, function<T(T, T)> f = [](T x, T y) { returnmin(x, y); }) : n(a.size()), func(f) { int LOG = __lg(n) + 1; st.assign(LOG, vector<T>(n)); log2_.resize(n + 1); log2_[1] = 0; for (int i = 2; i <= n; i++) log2_[i] = log2_[i >> 1] + 1;
st[0] = a; for (int j = 1; j < LOG; j++) for (int i = 0; i + (1 << j) <= n; i++) st[j][i] = func(st[j - 1][i], st[j - 1][i + (1 << (j - 1))]); }
T query(int l, int r) { int k = log2_[r - l + 1]; returnfunc(st[k][l], st[k][r - (1 << k) + 1]); } }; voidsolve() {
int n, h; cin >> n >> h; vi nums(n + 2);
rep(i, 1, n) { int d; cin >> d; nums[i] = d; }
vi sl(n + 2); vi wl(n + 2);
vi L(n + 2); vi R(n + 2); stack<int> stl; for (int i = 1; i <= n; i++) { while (!stl.empty() && nums[stl.top()] <= nums[i]) { stl.pop(); } int now = 0; if (stl.empty()) { now = 0; L[i] = 1; } else { now = stl.top(); L[i] = now + 1; ; }
sl[i] = sl[now] + (i - now) * nums[i]; wl[i] = i * h - sl[i]; stl.emplace(i); } vi sr(n + 2); vi wr(n + 2); stack<int> str; for (int i = n; i >= 1; i--) { while (!str.empty() && nums[str.top()] <= nums[i]) { str.pop(); } int now = 0; if (str.empty()) { now = n + 1; R[i] = n; } else { now = str.top(); R[i] = str.top() - 1; } sr[i] = sr[now] + (now - i) * nums[i]; wr[i] = (n - i + 1) * h - sr[i]; str.emplace(i); }
vi sum(n + 2); for (int i = 1; i <= n; i++) { sum[i] = wl[i] + wr[i] - (h - nums[i]); } auto cmp_max = [](int x, int y) { returnmax(x, y); }; SparseTable<int> wtst(sum, cmp_max); int ans = 0; for (int k = 1; k <= n; k++) { int lft = wtst.query(L[k], k); int rit = wtst.query(k, R[k]);
ans = max(ans, lft + rit - sum[k]); } cout << ans << '\n'; }