#include<bits/stdc++.h>
using namespace std;
int a[500010]; //原数组
int b[500010]; //差分数组
int c[500010]; //数状数组
int n,m,p,x,y,k;
int lowbit(int x){
return x&(-x);
}
void update(int x,int k){
for(int i=x;i<=n;i+=lowbit(i)){
c[i]+=k;
}
}
int sum(int x){
int ans=0;
while(x>0){
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){ //输入原数组并计算出差分数组,并更新树状数组
cin>>a[i];
b[i]=a[i]-a[i-1];
update(i,b[i]); //单值修改
}
for(int i=1;i<=m;i++){
cin>>p;
if(p==1){
cin>>x>>y>>k; //[x,y] +k 相当于对于 差分数组b进行两次单值修改
update(x,k);
update(y+1,-k);
}else{
cin>>x; //单值查询,相当于求差分数组的前x项之和
cout<<sum(x)<<endl;
}
}
return 0;
}
/*
5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4
a[10]={ 0, 1, 5, 4, 2, 3};
s[10]={ 0, 1, 4,-1,-2, 1};
1 2 4 2 原数组需要区间修改
等价于对差分数组进行两次单值修改 s[2]+=2 s[4+1]-=2
2 3 原数组需要查询单值
等价于对差分数组求前x项之和 sum[1,3];
1 1 5 -1 原数组需要区间修改
等价于对差分数组进行两次单值修改 s[1]+= -1 s[5+1]-= -1
1 3 5 7 原数组需要区间修改
等价于对差分数组进行两次单值修改 s[3]+= 7 s[5+1]-= 7
2 4 原数组需要查询单值
等价于对差分数组求前x项之和 sum[1,4];
总结:原数组的区间修改单值查询问题相当于是对差分数组进行单值修改 区间求和问题
*/
C++ 区间修改单值查询
最新推荐文章于 2024-05-23 22:44:33 发布