题目链接:区间修改区间查询
分析
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,q;
ll c[1000001],c1[1000001];
int lowbit(int x){return x&(-x);}
void update(ll x,ll y)
{
for(int i=x;i<=n;i+=lowbit(i))
{
c[i]+=y;
c1[i]+=1ll*y*x;
}
}
ll getsum(int x)
{
ll sum=0;
for(int i=x;i>0;i-=lowbit(i))
{
sum+=c[i]*(x+1)-c1[i];
}
return sum;
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
update(i,t);
update(i+1,-t);
}
while(q--)
{
int z,x,y;
scanf("%d%d%d",&z,&x,&y);
if(z==1)
{
int k;
scanf("%d",&k);
update(x,k);
update(y+1,-k);//差分
}
else cout<<getsum(y)-getsum(x-1)<<endl;//类似前缀和的维护
}
return 0;
}