有 q 個初始數值,依次進行 n 次操作(+x, -x, *x, @x 取模),每次操作後將超出 [L, R] 範圍的值截斷至邊界。求最終 q 個數值(按原順序輸出)。
struct Node {
Node *ls, *rs;
long long a, b; // 懶標記:f(x) = a*x + b
long long mn, mx; // 區間最小/最大值
Node(): ls(nullptr), rs(nullptr), a(1), b(0), mn(0), mx(0) {}
void apply(long long na, long long nb) { // 應用線性變換
mn = na * mn + nb;
mx = na * mx + nb;
if (na < 0) swap(mn, mx); // 斜率為負時翻轉
a = na * a;
b = na * b + nb;
}
void pushdown() {
if (a != 1 || b != 0) {
ls->apply(a, b);
rs->apply(a, b);
a = 1; b = 0;
}
}
};