1 #include<bits/stdc++.h> 2 using namespace std; 3 inline int read() 4 { 5 int x=0,f=1;char c=getchar(); 6 if(c==‘-‘) f=-1; 7 for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1; 8 for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘; 9 return x*f; 10 } 11 const int N=100005; 12 int ans,q; 13 int ll,rr,aa1,dd; 14 struct node 15 { 16 int l,r,w,a1,d; 17 }tree[N*4+5]; 18 inline void build(int l,int r,int k) 19 { 20 tree[k].l=l;tree[k].r=r; 21 if(l==r) 22 { 23 tree[k].w=read(); 24 return; 25 } 26 int mid=l+r>>1; 27 build(l,mid,k*2); 28 build(mid+1,r,k*2+1); 29 tree[k].w=tree[k*2].w+tree[k*2+1].w; 30 } 31 inline void dowm(int k) 32 { 33 int nn=tree[k*2].r-tree[k*2].l+1; 34 int mm=tree[k*2+1].r-tree[k*2+1].l+1; 35 tree[k*2].a1+=tree[k].a1; 36 tree[k*2+1].a1+=tree[k].a1+nn*tree[k].d; 37 tree[k*2].d+=tree[k].d; 38 tree[k*2+1].d+=tree[k].d; 39 tree[k*2].w+=tree[k].a1*nn+nn*(nn-1)/2*tree[k].d; 40 tree[k*2+1].w+=(tree[k].a1+nn*tree[k].d)*mm+mm*(mm-1)/2*tree[k].d; 41 tree[k].a1=0; 42 tree[k].d=0; 43 } 44 inline void add(int k) 45 { 46 int l=tree[k].l;int r=tree[k].r; 47 if(l>=ll&&r<=rr) 48 { 49 tree[k].a1+=aa1+(l-ll)*dd; 50 tree[k].d+=dd; 51 tree[k].w+=(aa1+(l-ll)*dd)*(r-l+1)+(r-l+1)*(r-l)/2*dd; 52 return; 53 } 54 dowm(k); 55 int mid=l+r>>1; 56 if(mid>=ll) add(k*2); 57 if(mid<rr) add(k*2+1); 58 tree[k].w=tree[k*2].w+tree[k*2+1].w; 59 } 60 inline void ask(int k) 61 { 62 int l=tree[k].l;int r=tree[k].r; 63 if(l==q&&r==q) 64 { 65 ans=tree[k].w; 66 return; 67 } 68 dowm(k); 69 int mid=l+r>>1; 70 if(mid>=q) ask(k*2); 71 if(mid<q) ask(k*2+1); 72 } 73 int main() 74 { 75 int n,m; 76 n=read();m=read(); 77 build(1,n,1); 78 while(m--) 79 { 80 int opt=read(); 81 if(opt==1) 82 { 83 84 ll=read();rr=read();aa1=read();dd=read(); 85 add(1); 86 } 87 if(opt==2) 88 { 89 q=read(); 90 ask(1); 91 printf("%d\n",ans); 92 } 93 } 94 return 0; 95 }
原文:https://www.cnblogs.com/SuSuSOS/p/13376965.html