ARRIVE a b:進貨 a 個單價 b 的冰淇淋BUY a b:用 b 元買 a 個最便宜的,能買輸出 HAPPY 並扣除庫存,否則 UNHAPPY先讀入所有操作,收集進貨價格離散化建樹。每個節點維護:
num:區間冰淇淋總數sum:區間總價值price:葉節點單價// 單點更新進貨
void update(int v, int pos, LL num, LL mon, LL t) {
if (tree[v].l == tree[v].r) {
if (!tree[v].price) tree[v].price = mon;
tree[v].num += num; tree[v].sum += t; return;
}
push_down(v);
int mid = (tree[v].l + tree[v].r) >> 1;
if (pos <= mid) update(v*2, pos, num, mon, t);
else update(v*2+1, pos, num, mon, t);
push_up(v);
}
// 購買查詢:優先左子樹(便宜),返回總價或 -1
LL query(int v, LL num) {
if (tree[v].num < num) return -1;
if (tree[v].num == num) return tree[v].sum;
if (tree[v].l == tree[v].r) return tree[v].price * num;
if (tree[v*2].num >= num) return query(v*2, num);
return tree[v*2].sum + query(v*2+1, num - tree[v*2].num);
}
// 購買後扣除庫存
void update_1(int v, LL num, LL sum) { ... }
主循環按輸入順序處理操作,BUY 先 query 再 update_1。