题意:
两种操作:
1.区间修改
2.求区间和
参考博客:http://blog.youkuaiyun.com/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;
}