#include <cstdio> #include <cstring> #define MAXN 100000 + 10#define Lson L, Mid, Rt<<1#define Rson mid+1, R, rt<<1|1struct node{int sum, lazy;} t[maxn<<2];void pushup (int rt) {t[rt].sum = T[rt<<1].sum + t[rt<<1|1].sum;} void pushdown (int L, int R, int rt) {int mid = (L + R) >> 1; T[rt<<1].sum = T[rt].lazy * (mid-l + 1); T[rt<<1|1].sum = T[rt].lazy * (r-mid); T[rt<<1].lazy = T[rt].lazy; T[rt<<1|1].lazy = T[rt].lazy; T[rt].lazy = 0;} void Build (int L, int R, int rt) {if (L = = R) {scanf ("%d", &t[rt].sum); return; } int mid = (L + R) >> 1; Build (Lson); Build (Rson); Pushup (RT);} void Update (int l, int r, int v, int l, int r, int rt) {if (l==l && r==r) {t[rt].lazy = v; T[rt].sum = v * (r-l + 1); return; } int mid = (L + R) >> 1; if (t[rt].lazy) pushdown (L, R, RT); if (R <= mid) Update (L, R, V, lson); else if (L > Mid) Update (L, R, V, Rson); else {Update (L, Mid, V, Lson); Update (mid+1, R, V, Rson); } pushup (RT);} int Query (int l, int r, int l, int r, int rt) {if (l==l && r== R) return t[rt].sum; int mid = (L + R) >> 1; if (t[rt].lazy) pushdown (L, R, RT); if (R <= mid) return Query (L, R, Lson); else if (L > Mid) return Query (L, R, Rson); Return query (L, Mid, Lson) + query (mid + 1, R, Rson);} int main () {int n, q; scanf ("%d", &n); Build (1, N, 1); scanf ("%d", &q); int A, B, C, D; while (q--) {scanf ("%d%d%d", &a, &b, &c); if (a) {scanf ("%d", &d); Update (b, C, D, 1, N, 1); } else printf ("%d\n", Query (b, C, 1, N, 1)); } return 0;}
Modifying the lazy tag Dafa in the segment tree interval