#include<bits/stdc++.h>
using namespace std;
int n,m;
int At[1000005];
int Bt[1000005];
int lowbit(int x)
{
return x&(-x);
}
void Aadd(int pos,int x)
{
while(pos<=n)
{
At[pos]+=x;
pos+=lowbit(pos);
}
}
int Asum(int pos)
{
int cnt=0;
while(pos>0)
{
cnt+=At[pos];
pos-=lowbit(pos);
}
return cnt;
}
void Badd(int pos,int x)
{
while(pos<=n)
{
Bt[pos]+=x;
pos+=lowbit(pos);
}
}
int Bsum(int pos)
{
int cnt=0;
while(pos>0)
{
cnt+=Bt[pos];
pos-=lowbit(pos);
}
return cnt;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
Aadd(i,x);
Aadd(i+1,-x);
Badd(i,x*i);
Badd(i+1,-(x*i));
}
while(m--)
{
int q;
cin>>q;
if(q==1)
{
int x,y,k;
cin>>x>>y>>k;
Aadd(x,k);
Aadd(y+1,-k);
Badd(x,k*x);
Badd(y+1,-(k*y));
}
else
{
int x,y;
cin>>x>>y;
cout<<((y+1)*Asum(y)-Bsum(y))-((x+1)*Asum(x)-Bsum(x))<<'\n';
}
}
return 0;
}
设原始数组为 a,树状数组为 b。
那么
i=1∑xai=i=1∑1bi+i=1∑2bi+i=1∑3bi+⋯i=1∑xbi=b1×x+b2×(x−1)+b3×(x−2)+⋯+bx×1=(x+1)i=1∑xdi−1×d1−2×d2+⋯+x×dx=(x+1)i=1∑xdi−i=1∑x(i×di)