struct SegmentTree { struct Node { LL delta, mul, sum; }s[MAXN * 4 + 5]; SegmentTree() {} #define lson p << 1 #define rson p << 1 | 1 void add(int p, int len, LL v) { s[p].delta = (s[p].delta + v) % mod; s[p].sum = (s[p].sum + v * len) % mod; } void mul(int p, LL v) { s[p].mul = s[p].mul * v % mod; s[p].delta = s[p].delta * v % mod; s[p].sum = s[p].sum * v % mod; } void pd(int p, int len) { if (s[p].mul != 1) { mul(lson, s[p].mul); mul(rson, s[p].mul); s[p].mul = 1; } if (s[p].delta) { add(lson, len - len / 2, s[p].delta); add(rson, len / 2, s[p].delta); s[p].delta = 0; } } void upd(int p) { s[p].sum = (s[lson].sum + s[rson].sum) % mod; } void build(int p, int l, int r) { s[p].mul = 1; if (l == r) { s[p].sum = a[l]; return; } int mid = (l + r) >> 1; build(lson, l, mid); build(rson, mid + 1, r); upd(p); } void modify(int p, int l, int r, int x, int y, LL v) { if (x <= l && y >= r) { add(p, r - l + 1, v); return; } pd(p, r - l + 1); int mid = (l + r) >> 1; if (x <= mid) modify(lson, l, mid, x, y, v); if (y > mid) modify(rson, mid + 1, r, x, y, v); upd(p); } void update(int p, int l, int r, int x, int y, LL v) { if (x <= l && y >= r) { mul(p, v); return; } pd(p, r - l + 1); int mid = (l + r) >> 1; if (x <= mid) update(lson, l, mid, x, y, v); if (y > mid) update(rson, mid + 1, r, x, y, v); upd(p); } LL query(int p, int l, int r, int x, int y) { if (x <= l && y >= r) return s[p].sum % mod; pd(p, r - l + 1); int mid = (l + r) >> 1; LL ret = 0; if (x <= mid) ret = query(lson, l, mid, x, y); if (y > mid) ret = (ret + query(rson, mid + 1, r, x, y)) % mod; return ret; } }Sgt;
|
近期评论