令原数组为A,差分数组为D
建立两个树状数组,一个存储差分数组,一个存储(i−1)⋅D i数组。
#include<iostream>
using namespace std;
int n,m;
int a[100010]={0},d1[100010],d2[100010];
int lowbit(int x)
{
return x&(-x);
}
void query(int cnt,int x)
{
int t=cnt;
while(cnt<=n)
{
d1[cnt]+=x;
d2[cnt]+=(t-1)*x;
cnt+=lowbit(cnt);
}
}
int getsum(int cnt)
{
int res=0,sum=cnt;
while(cnt>0)
{
res+=sum*d1[cnt]-d2[cnt];
cnt-=lowbit(cnt);
}
return res;
}
int main ()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
query(i,a[i]-a[i-1]);
}
while(m--)
{
char q;
cin>>q;
if(q=='C')
{
int l,r,x;
cin>>l>>r>>x;
query(l,x);
query(r+1,-x);
}
else
{
int l,r;
cin>>l>>r;
cout<<getsum(r)-getsum(l-1)<<endl;
}
}
}