http://codevs.cn/problem/1082/
【AC】
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=2e5+2; 5 int n; 6 ll a[maxn]; 7 ll c1[maxn]; 8 ll c2[maxn]; 9 int lowbit(int x) 10 { 11 return x&-x; 12 } 13 void add(ll *c,int k,ll val) 14 { 15 while(k<=n){ 16 c[k]+=val; 17 k+=lowbit(k); 18 } 19 } 20 ll query(ll *c,int k) 21 { 22 ll ans=0; 23 while(k) 24 { 25 ans+=c[k]; 26 k-=lowbit(k); 27 } 28 return ans; 29 } 30 ll solve(int x) 31 { 32 ll ans=0; 33 ans+=x*query(c1,x); 34 ans-=query(c2,x); 35 return ans; 36 } 37 ll solve(int x,int y) 38 { 39 return solve(y)-solve(x-1); 40 } 41 int main() 42 { 43 while(~scanf("%d",&n)) 44 { 45 a[0]=0; 46 for(int i=1;i<=n;i++) 47 { 48 scanf("%I64d",&a[i]); 49 // cout<<a[i]<<endl; 50 add(c1,i,a[i]-a[i-1]); 51 add(c2,i,(i-1)*(a[i]-a[i-1])); 52 } 53 int q; 54 scanf("%d",&q); 55 int tp; 56 while(q--) 57 { 58 scanf("%d",&tp); 59 if(tp==1) 60 { 61 int x,y;ll val; 62 scanf("%d%d%I64d",&x,&y,&val); 63 add(c1,x,val); 64 add(c1,y+1,-val); 65 add(c2,x,1ll*(x-1)*val); 66 add(c2,y+1,-1ll*y*val); 67 } 68 else 69 { 70 int x,y; 71 scanf("%d%d",&x,&y); 72 ll ans=solve(x,y); 73 printf("%I64d\n",ans); 74 } 75 } 76 } 77 return 0; 78 }