4
void update(int tidx, int s, int e, int idx, int val) {11
update(2 * tidx, s, mid, idx, val);13
update(2 * tidx + 1, mid + 1, e, idx, val);14
stree[tidx] = min(stree[2 * tidx], stree[2 * tidx + 1]);16
int query(int tidx, int s, int e, int l, int r) {19
else if (s >= l and e <= r)21
int mid = (s + e) / 2;22
int left = query(2 * tidx, s, mid, l, r);23
int right = query(2 * tidx + 1, mid + 1, e, l, r);24
return min(left, right);26
int boxDelivering(vector<vector<int>> &boxes, int port, int box, int weigh) {28
vector<long long> trips(n + 1), pref(n);29
trips[0] = 0, pref[0] = boxes[0][1];30
for (int i = 1; i < n; i++) {31
pref[i] = pref[i - 1] + boxes[i][1];32
if (boxes[i][0] != boxes[i - 1][0]) {33
trips[i] = trips[i - 1] + 1;35
trips[i] = trips[i - 1];38
trips[n] = trips[n - 1];39
vector<long long> dp(n);40
stree = vector<int>(4 * n + 1, INT_MAX);41
update(1, 0, n - 1, 0, 0);42
// dp[i] = dp[j] + (trips[i] - trips[j+1]) + 243
for (int i = 0; i < n; i++) {47
int mid = (l + r) / 2;48
long long tot = pref[i] - ((mid - 1 >= 0) ? pref[mid - 1] : 0);49
if (tot <= weigh and i - mid + 1 <= box) {55
int mini = query(1, 0, n, l, i);56
dp[i] = mini + trips[i] + 2;57
update(1, 0, n, i + 1, dp[i] - trips[i + 1]);