题目:
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int tree[N],a[N],n,m;
int lowbit(int x)
{
return x&(-x);
}
void updata(int i,int t)
{
while(i<=n)
{
tree[i]+=t;
i+=lowbit(i);
}
}
int quiry(int i)
{
int res=0;
while(i>0)
{
res+=tree[i];
i-=lowbit(i);
}
return res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
updata(i,a[i]-a[i-1]);//更新差值
}
while(m--)
{
int f,x;
cin>>f>>x;
if(f==1){
int y,k;
cin>>y>>k;
//维持区间内的差值不变
updata(x,k);
updata(y+1,-k);
}
else{
//0~x区间的值即为所求
cout<<quiry(x)<<endl;
}
}
return 0;
}
}
总结:
这类题型运用到的是差分的思想,当对一段区间的值进行修改时,需要维持当前区间的差值不变
构建树状数组时也需要通过差分进行构建