henry_wang4412 P3372 【模板】线段树 1 纠正
public
Mar 08, 2025
Never
39
1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 const int N=1e5+5; 5 struct segment 6 { 7 int l,r,sum,lazy; 8 }s[N<<2]; 9 int n,m,a[N],op,x,y,k; 10 void build(int l,int r,int p) 11 { 12 s[p].l=l; 13 s[p].r=r; 14 if(l==r) 15 { 16 s[p].sum=a[l]; 17 return ; 18 } 19 int mid=l+r>>1; 20 build(l,mid,p<<1); 21 build(mid+1,r,p<<1|1); 22 s[p].sum=s[p<<1].sum+s[p<<1|1].sum; 23 } 24 void add(int p,int k) 25 { 26 s[p].lazy+=k; 27 s[p].sum+=(s[p].r-s[p].l+1)*k; 28 } 29 void pushdown(int p) 30 { 31 add(p<<1,s[p].lazy); 32 add(p<<1|1,s[p].lazy); 33 s[p].lazy=0; 34 } 35 void update(int x,int y,int k,int p) 36 { 37 if(x <= s[p].l && s[p].r <= y) 38 { 39 add(p,k); 40 return ; 41 } 42 pushdown(p); 43 int mid=s[p].l+s[p].r>>1; 44 if(x<=mid) 45 { 46 update(x,y,k,p<<1); 47 } 48 if(mid+1<=y) 49 { 50 update(x,y,k,p<<1|1); 51 } 52 s[p].sum=s[p<<1].sum+s[p<<1|1].sum; 53 } 54 int query(int l,int r,int p) 55 { 56 // if(s[p].l == s[p].r) // 这是 单点修改 57 if(l<=s[p].l && s[p].r<=r) // 这是 区间修改 58 { 59 return s[p].sum; 60 } 61 pushdown(p); 62 int mid=s[p].l+s[p].r>>1; 63 if(r<=mid) 64 { 65 return query(l,r,p<<1); 66 } 67 if(l>=mid+1) 68 { 69 return query(l,r,p<<1|1); 70 } 71 return query(l,r,p<<1)+query(l,r,p<<1|1); 72 } 73 signed main() 74 { 75 scanf("%d%d",&n,&m); 76 for(int i=1;i<=n;i++) 77 { 78 scanf("%lld",&a[i]); 79 } 80 build(1,n,1); 81 for(int i=1;i<=m;i++) 82 { 83 scanf("%d",&op); 84 if(op==1) 85 { 86 scanf("%d%d%lld",&x,&y,&k); 87 update(x,y,k,1); 88 } 89 else 90 { 91 scanf("%d%d",&x,&y); 92 printf("%lld\n",query(x,y,1)); 93 } 94 } 95 return 0; 96 }