1 #include<iostream> 2 3 #define maxn 100007 4 using namespace std; 5 6 int Sum[maxn<<2],lazy[maxn<<2]; 7 int a[maxn],n; 8 9 void Pushup(int rt){Sum[rt]=Sum[rt<<1]+Sum[rt<<1|1];}//更新节点信息 10 //建树 11 void Build(int l,int r,int rt)//l,r当前节点区间,rt当前节点编号; 12 { 13 if(l==r) 14 { 15 Sum[rt]=a[l]; 16 return ; 17 } 18 19 int m=(l+r)>>1; 20 21 Build(l,m,rt<<1); 22 Build(m+1,r,rt<<1|1); 23 24 Pushup(rt); 25 } 26 27 //下推懒标记 28 void Pushdown(int rt,int ln,int rn)//ln rn 左子树右子树数字数量 29 { 30 if(lazy[rt]) 31 { 32 lazy[rt<<1]+=lazy[rt]; 33 lazy[rt<<1|1]+=lazy[rt]; 34 35 Sum[rt<<1]+=lazy[rt]*ln; 36 Sum[rt<<1|1]+=lazy[rt]*rn; 37 38 lazy[rt]=0; 39 } 40 } 41 42 //更新节点 43 void Update(int L,int C,int l,int r,int rt)//a[L]=C 44 { 45 if(l==r) 46 { 47 Sum[rt]+=C; 48 return ; 49 } 50 51 int m=(l+r)>>1; 52 Pushdown(rt,m-l+1,r-m); 53 54 if(L<=m)Update(L,C,l,m,rt<<1); 55 else 56 Update(L,C,m+1,r,rt<<1|1); 57 58 Pushup(rt); 59 } 60 61 //更新区间 62 void update(int L,int R,int C,int l,int r,int rt)//L,R操作区间 l,r当前区间rt节点 63 { 64 if(L<=l&&r<=R) 65 { 66 Sum[rt]+=C*(r-l+1); 67 lazy[rt]+=C; 68 return ; 69 } 70 int m=(l+r)>>1; 71 Pushdown(rt,m-l+1,r-m); 72 73 if(L<=m)update(L,R,C,l,m,rt<<1); 74 if(R>m)update(L,R,C,m+1,r,rt<<1|1); 75 Pushup(rt); 76 } 77 //查询区间 78 int Query(int L,int R,int l,int r,int rt) 79 { 80 if(L<=l&&r<=R) 81 { 82 return Sum[rt]; 83 } 84 85 int m=(l+r)>>1; 86 Pushdown(rt,m-l+1,r-m); 87 88 int ans=0; 89 if(L<=m)ans+=Query(L,R,l,m,rt<<1); 90 if(R>m)ans+=Query(L,R,m+1,r,rt<<1|1); 91 return ans; 92 } 93 94 95 //函数调用 96 Build(1,n,1); 97 Update(L,C,1,n,1); 98 update(L,R,C,1,n,1); 99 int ans=Query(L,R,1,n,1);