线段树
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #include<iostream> 6 using namespace std; 7 8 #define maxn 200000 9 10 int n,m,fg,a,b; 11 long long x; 12 int num[maxn+5]; 13 14 struct tree{ 15 int l; 16 int r; 17 long long sum; 18 int lazy; 19 }t[maxn*4+5]; 20 21 void pushup(int u){ 22 t[u].sum=t[u<<1].sum+t[u<<1|1].sum; 23 } 24 25 void pushdown(int u){ 26 if(t[u].lazy){ 27 t[u<<1].lazy+=t[u].lazy; 28 t[u<<1|1].lazy+=t[u].lazy; 29 t[u<<1].sum+=(t[u<<1].r-t[u<<1].l+1)*t[u].lazy; 30 t[u<<1|1].sum+=(t[u<<1|1].r-t[u<<1|1].l+1)*t[u].lazy; 31 t[u].lazy=0; 32 } 33 } 34 35 void build(int u,int l,int r){ 36 t[u].l=l; 37 t[u].r=r; 38 t[u].lazy=0; 39 if(l==r){ 40 t[u].sum=num[l]; 41 return; 42 } 43 int mid=(l+r)>>1; 44 build(u<<1,l,mid); 45 build(u<<1|1,mid+1,r); 46 pushup(u); 47 } 48 49 void update(int u,int l,int r,long long x){ 50 if(t[u].l>=l&&t[u].r<=r){ 51 t[u].lazy+=x; 52 t[u].sum+=(t[u].r-t[u].l+1)*x; 53 return; 54 } 55 pushdown(u); 56 int mid=(t[u].l+t[u].r)>>1; 57 if(l<=mid)update(u<<1,l,r,x); 58 if(r>mid)update(u<<1|1,l,r,x); 59 pushup(u); 60 } 61 62 long long query(int u,int l,int r){ 63 if(t[u].l>=l&&t[u].r<=r)return t[u].sum; 64 pushdown(u); 65 int mid=(t[u].l+t[u].r)>>1; 66 long long ans=0; 67 if(l<=mid)ans+=query(u<<1,l,r); 68 if(r>mid)ans+=query(u<<1|1,l,r); 69 return ans; 70 } 71 72 int main(){ 73 cin>>n; 74 for(int i=1;i<=n;i++) 75 cin>>num[i]; 76 build(1,1,n); 77 cin>>m; 78 for(int i=1;i<=m;i++){ 79 cin>>fg; 80 if(fg==1){ 81 cin>>a>>b>>x; 82 update(1,a,b,x); 83 } 84 else if(fg==2){ 85 cin>>a>>b; 86 cout<<query(1,a,b)<<endl; 87 } 88 } 89 return 0; 90 }