树状数组(区间修改单点查询)洛谷:树状数组2
模版和单点修改区间查询差不多
树状数组(单点修改区间查询)
http://106.12.15.69:85/index.php/archives/62/
然后用到了差分数组
http://106.12.15.69:85/index.php/archives/64/
代码
#include <bits/stdc++.h>
using namespace std;
int tree[1000000];
int cha[1000000];
int m,n;
int lowbit(int x){
return x&(-x);
}
void add(int x,int k){
while(x<=n){
tree[x]+=k;
x+=lowbit(x);
}
}
int query(int x){
int ans=0;
while(x>0){
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
int main(int argc, const char * argv[]) {
cin>>n>>m;
memset(cha,0,sizeof(cha));
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++){
cin>>cha[i];
add(i,cha[i]-cha[i-1]);
}
for(int i=0;i<m;i++){
int w;
cin>>w;
if(w==1){
int x,y,k;
cin>>x>>y>>k;
add(x,k);
add(y+1,-k);
}else{
int x;
cin>>x;
cout<<query(x)<<endl;
}
}
return 0;
}