# [ZJ q838](https://zerojudge.tw/ShowProblem?problemid=q838)
code
```cpp=
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define F first
#define S second
#define Bbicorz ios_base::sync_with_stdio(false),cin.tie(nullptr),cout.tie(NULL)
const int INF = 1e18 + 1;
struct Segment_tree{
vector<int> seg;
vector<int> arr;
Segment_tree(int n){
arr.resize(n + 1);
seg.resize(4 * n + 5);
}
inline void build(int l, int r, int idx){
if(l == r) return seg[idx] = arr[l], void();
int mid = (l + r) >> 1;
build(l, mid, idx << 1);
build(mid + 1, r, idx << 1 | 1);
seg[idx] = min(seg[idx << 1], seg[idx << 1 | 1]);
}
inline int query(int l, int r, int idx, int val) {
if(l == r) return l;
int mid = l + r >> 1;
if(seg[idx << 1] == val) return query(l, mid, idx << 1, val);
return query(mid + 1, r, idx << 1 | 1, val);
}
inline void modify(int l, int r, int idx, int node, int k){
if(l == r) return seg[idx] = k, arr[l] = k, void();
int mid = (l + r) >> 1;
if(mid >= node) modify(l, mid, idx << 1, node, k);
else modify(mid + 1, r, idx << 1 | 1, node, k);
seg[idx] = min(seg[idx << 1], seg[idx << 1 | 1]);
}
};
inline void solve(){
int n, k;
cin >> n >> k;
Segment_tree f(n);
vector<pii> link(n + 5); // F is left node, S is right node
for(int i = 1; i <= n; ++i) cin >> f.arr[i];
for(int i = 1; i <= n; ++i) link[i].F = i - 1, link[i].S = i + 1;
f.build(1, n, 1);
auto ers = [&](int idx){
int fr = link[idx].F;
int ba = link[idx].S;
link[fr].S = ba;
link[ba].F = fr;
link[idx] = {n + 2, n + 2};
return ba;
};
int ans = 0;
int cnt = 0;
while(cnt < n) {
int mi = f.seg[1];
if(mi > k) break;
int idx = f.query(1, n, 1, mi);
int ba = ers(idx);
f.modify(1, n, 1, idx, INF);
if(ba <= n) f.modify(1, n, 1, ba, f.arr[ba] + mi);
ans += mi;
}
cout << ans << '\n';
}
signed main() {
Bbicorz;
int T = 1;
// cin >> T;
while (T--) solve();
}
```
不開玩笑我在賽中真的這樣寫然後花了我一個半小時,沒事請別這麼幹,他害我來不及看p4,請引以為戒。~~除非你對你刻線段樹的技巧很有信心~~