【ybtoj】【树状数组】区间修改区间查询
题意
解析
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f,N = 1e6+10;
ll c[2][N];
int n,q;
int tmp;
void update(int x,int y)
{
for(int i=x;i<=n;i+=i&-i)
{
c[0][i]+=y;//d[i]
c[1][i]+=(ll)y*x;//d[i]*i注意+=y*x不是y*i
}
}
inline ll ask(int x)
{
ll sum=0;
for(int i=x;i;i-=i&-i)
{
sum+=c[0][i]*(x+1)-c[1][i];
}
return sum;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
update(i,x-tmp);
tmp=x;
}
for(int i=1;i<=q;i++)
{
int l,r,x,opt;
scanf("%d%d%d",&opt,&l,&r);
if(opt==1)
{
scanf("%d",&x);
update(l,x);
update(r+1,-x);
}
else
{
ll ans=ask(r)-ask(l-1);
printf("%lld\n",ans);
}
}
return 0;
}