题意:
两种操作:
1.区间修改
2.求区间和
参考博客:http://blog.csdn.net/fsahfgsadhsakndas/article/details/52650026
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 2e5+7; ll arr[maxn],c1[maxn],c2[maxn]; int n,q; void add(ll r[],int k,int v) { while(k<=n) { r[k] += v; k += k&(-k); } } ll getSum(ll r[],int k) { ll res = 0; while(k>0) { res += r[k]; k -= k&(-k); } return res; } int main() { scanf("%d",&n); for(int i = 1;i<=n;i++) scanf("%lld",arr+i); arr[0] = 0; memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(int i = 1;i<=n;i++) add(c1,i,arr[i]-arr[i-1]),add(c2,i,(i-1)*(arr[i]-arr[i-1])); scanf("%d",&q); while(q--) { int type; scanf("%d",&type); if(type==1) { int l,r,v; scanf("%d%d%d",&l,&r,&v); add(c1,l,v),add(c1,r+1,-v); add(c2,l,v*(l-1)),add(c2,r+1,-v*r); } else { int l,r; scanf("%d%d",&l,&r); ll sum1,sum2; sum1 = r*getSum(c1,r)-getSum(c2,r); sum2 = (l-1)*getSum(c1,l-1)-getSum(c2,l-1); printf("%lld\n",sum1-sum2); } } return 0; }