1 void build(int l,int r,int rt) {
2 lazyp[rt]=0;
3 lazym[rt]=1;
4 if (l == r) {
5 sum[rt] = a[l];
6 return;
7 }
8 int mid = (l + r) >> 1;
9 build(l, mid, rt << 1);
10 build(mid + 1, r, rt << 1 | 1);
11 sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
12 }
13
14 void updata(int x,int d,int l,int r,int rt){
15 if (l==r){
16 sum[rt]+=d;
17 return;
18 }
19 int mid=(l+r)>>1;
20 updata(x,d,l,mid,rt<<1);
21 updata(x,d,mid,r,rt<<1|1);
22 sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
23 }
24
25 void update(int l,int r,int d,int L,int R,int rt) {
26 if (l <= L && R <= r) {
27 sum[rt] += (r - l + 1) * d;
28 lazy[rt] += d;
29 return;
30 }
31 int mid = (l + r) >> 1;
32 pushdown(mid - l + 1, r - mid, rt);
33 if (l <= mid) updata(l, r, d, L, mid, rt << 1);
34 if (r > mid) updata(l, r, d, mid+1, R, rt << 1 | 1);
35 sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
36 }
37
38 void update(int l,int r,int d,int L,int R,int rt) {
39 if (l <= L && R <= r) {
40 sum[rt] *=d;
41 lazym[rt] *=d;
42 lazyp[rt]*=d
43 return;
44 }
45 int mid = (l + r) >> 1;
46 pushdown(mid - l + 1, r - mid, rt);
47 if (l <= mid) updata(l, r, d, L, mid, rt << 1);
48 if (r > mid) updata(l, r, d, mid+1, R, rt << 1 | 1);
49 sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
50 }
51
52 void update(int l,int r,int d,int L,int R,int rt) {
53 if (l <= L && R <= r) {
54 sum[rt] += (r - l + 1) * d;
55 lazyp[rt] += d;
56 return;
57 }
58 int mid = (l + r) >> 1;
59 pushdown(mid - l + 1, r - mid, rt);
60 if (l <= mid) updata(l, r, d, L, mid, rt << 1);
61 if (r > mid) updata(l, r, d, mid+1, R, rt << 1 | 1);
62 sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
63 }
64
65 void pushdown(int l,int r,int rt) {
66 if (lazy[rt] == 0) {
67 return;
68 }
69 lazy[rt << 1] += lazy[rt];
70 lazy[rt << 1 | 1] += lazy[rt];
71 lazy[rt] = 0;
72 sum[rt << 1] += lazy[rt << 1] * l;
73 sum[rt << 1 | 1] += lazy[rt << 1 | 1] * r;
74 }
75
76 void pushdown(int l,int r,int rt) {
77 if (lazyp[rt]==0&&lazym[rt]==1){
78 return;
79 }
80 sum[rt<<1]=(sum[rt<<1]*lazym[rt]+lazyp[rt]*l);
81 sum[rt<<1|1]=(sum[rt<<1|1]*lazym[rt]+lazyp[rt]*l);
82
83 lazym[rt << 1] =lazym[rt<<1]*lazym[rt];
84 lazym[rt << 1|1] =lazym[rt<<1|1]*lazym[rt];
85
86 lazyp[rt << 1] =lazyp[rt<<1]*lazym[rt]+lazyp[rt];
87 lazyp[rt << 1|1] =lazyp[rt<<1|1]*lazym[rt]+lazyp[rt];
88
89 lazyp[rt]==0;
90 lazym[rt]==1;
91 }
92
93 int query(int l,int r,int L,int R,int rt) {
94 if (l <= L && R <= r) {
95 return sum[rt];
96 }
97 int mid = (l + r) >> 1;
98 int ret = 0;
99 pushdown(mid - l + 1, r - mid, rt);
100 if (l <= mid) ret += query(l, r, L, mid, rt << 1);
101 if (r > mid) ret += query(l, r, mid + 1, R, rt << 1 | 1);
102 return ret;
103 }