1, Los template Valley P3372 [1] segment tree
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ls(p) (p<<1) 4 #define rs(p) (p<<1|1) 5 #define ll long long 6 const int MAXN=1e5+5; 7 struct node 8 { 9 ll sum,lazy; 10 node(){sum=0,lazy=0;} 11 }T[MAXN*4]; 12 int a[MAXN]; 13 int n,m; 14 inline void push_up(int p) 15 { 16 T[p].sum=T[ls(p)].sum+T[rs(p)].sum; 17 } 18 inline void build(int p,int l,int r) 19 { 20 if(l==r) 21 { 22 T[p].sum=a[l]; 23 return; 24 } 25 int mid=(l+r)>>1; 26 build(ls(p),l,mid); 27 build(rs(p),mid+1,r); 28 push_up(p); 29 } 30 inline void push_down(int p,int l,int r) 31 { 32 if(!T[p].lazy) return; 33 int mid=(l+r)>>1; 34 T[ls(p)].lazy+=T[p].lazy,T[rs(p)].lazy+=T[p].lazy; 35 T[ls(p)].sum+=T[p].lazy*(mid-l+1), 36 T[rs(p)].sum+=T[p].lazy*(r-mid); 37 T[p].lazy=0; 38 } 39 inline void update(int p,int l,int r,int nl,int nr,int k) 40 { 41 if(nl<=l&&nr>=r) 42 { 43 T[p].sum+=k*(r-l+1); 44 T[p].lazy+=k; 45 return; 46 } 47 push_down(p,l,r); 48 int mid=(l+r)>>1; 49 if(nl<=mid) update(ls(p),l,mid,nl,nr,k); 50 if(nr>=mid+1) update(rs(p),mid+1,r,nl,nr,k); 51 push_up(p); 52 } 53 ll query(int p,int l,int r,int nl,int nr) 54 { 55 ll ans=0; 56 if(nl<=l&&nr>=r) return T[p].sum; 57 push_down(p,l,r); 58 int mid=(l+r)>>1; 59 if(nl<=mid) ans+=query(ls(p),l,mid,nl,nr); 60 if(nr>=mid+1) ans+=query(rs(p),mid+1,r,nl,nr); 61 return ans; 62 } 63 int read() 64 { 65 int s=1,x=0;char ch=getchar(); 66 while(!isdigit(ch)){if(ch=='-') s=-1;ch=getchar();} 67 while(isdigit(ch)) {x=10*x+ch-'0';ch=getchar();} 68 return s*x; 69 } 70 int main() 71 { 72 //freopen("testdata.in","r",stdin); 73 n=read();m=read(); 74 for(int i=1;i<=n;++i) a[i]=read(); 75 build(1,1,n); 76 int opt,x,y,k; 77 for(int i=1;i<=m;++i) 78 { 79 opt=read(); 80 if(opt==1)//update 81 { 82 x=read(),y=read(),k=read(); 83 update(1,1,n,x,y,k); 84 } 85 else //query 86 { 87 x=read(),y=read(); 88 cout<<query(1,1,n,x,y)<<endl; 89 } 90 } 91 return 0; 92 }