想要用树状数组实现区间求和以及区间修改
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n,m;
int a[N+5];
int bin[N+5];
int bin2[N+5];
int lowbit(int x)
{
return x&(-x);
}
void add_bin(int x,int k)
{
for(int i=x;i<=n;i+=lowbit(i))
bin[i]+=k;
return ;
}
int ask_bin(int x)
{
int cnt=0;
for(int i=x;i>=1;i-=lowbit(i))
cnt+=bin[i];
return cnt;
}
void add_bin2(int x,int k)
{
for(int i=x;i<=n;i+=lowbit(i))
bin2[i]+=k;
return ;
}
int ask_bin2(int x)
{
int cnt=0;
for(int i=x;i>=1;i-=lowbit(i))
cnt+=bin2[i];
return cnt;
}
int sum(int x)
{
return ((n+1)*ask_bin(x))-ask_bin2(x);
}
main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
add_bin(i,a[i]-a[i-1]);
add_bin2(i,(a[i]-a[i-1])*i);
}
while(m--)
{
int op;
cin>>op;
if(op==1)
{
int l,r,k;
cin>>l>>r>>k;
add_bin(l,k),add_bin2(l,l*k);
// if(r<n)
add_bin(r+1,-k),add_bin2(r+1,-(r+1)*k);
}
else
{
int l,r;
cin>>l>>r;
cout<<sum(r)-sum(l-1)<<"\n";
}
}
return 0;
}
有参考一篇博文,戳这里