在单点更新的基础上运用差分的思想来构建树状数组。
对于一个数组A,建立数组D来记录数组A中连续数值的差值,即D【i】=A【i】-A【i-1】。
而A【i】=D【1】+D【2】+…+D【i】。
如果对数组A进行区间更新,将区间【L-R】每个数加上X,对于数组D来说,【L+1–R】的值是不发生变化的,D【l】会增加X,D【R+1】会减小X,所以区间更新A时只需要更改D数组中D【l】,D【R+1】两项的值即可。然后对D建立树状数组。
#include<iostream>
using namespace std;
int n,m;
int d[1000010];//树状数组
int a[1000010]={0};//原数组
int lowbit(int x)
{
return x&(-x);
}
void update(int cnt,int sum)
{
for(int i=cnt;i<=n;i+=lowbit(i))
d[i]+=sum;
}
int getsum(int x)
{
int res=0;
for(int i=x;i>0;i-=lowbit(i))
res+=d[i];
return res;
}
int main ()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
update(i,a[i]-a[i-1]);
}
for(int i=1;i<=m;i++)
{
int x;
cin>>x;
if(x==1)
{
int l,r,k;
cin>>l>>r>>k;
update(l,k);
update(r+1,-k);
}
else
{
int sum;
cin>>sum;
cout<<getsum(sum)<<endl;
}
}
}