单点修改,区间查询
#include<bits/stdc++.h> using namespace std; #define int long long #define lowbit(x) (x&(-x)) const int N=5e5+10; int a[N],s[N]; int n,m; void add(int x,int k){ for(int i=x;i<=n;i+=lowbit(i)){ s[i]+=k; } } int searchs(int l,int r){ int ans=0; for(int i=r;i;i-=lowbit(i)){ ans+=s[i]; } for(int i=l-1;i;i-=lowbit(i)){ ans-=s[i]; } return ans; } signed main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; add(i,a[i]); } while(m--){ int op; cin>>op; if(op==1){ int x,k; cin>>x>>k; add(x,k); } else{ int l,r; cin>>l>>r; cout<<searchs(l,r)<<endl; } } }
区间修改,单点查询
存储差分数组,在区间+k就是把l位置+k,r+1位置-k,然后单点查询就是查询1到x的和
#include<bits/stdc++.h> using namespace std; #define int long long #define lowbit(x) (x&(-x)) const int N=5e5+10; int a[N],s[N]; int n,m; void add(int x,int k){ for(int i=x;i<=n;i+=lowbit(i)){ s[i]+=k; } } int searchs(int l,int r){ int ans=0; for(int i=r;i;i-=lowbit(i)){ ans+=s[i]; } for(int i=l-1;i;i-=lowbit(i)){ ans-=s[i]; } return ans; } signed main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; add(i,a[i]-a[i-1]); } while(m--){ int op; cin>>op; if(op==1){ int x,y,k; cin>>x>>y>>k; add(x,k); add(y+1,-k); } else{ int x; cin>>x; cout<<searchs(1,x)<<endl; } } }
标签:树状,int,cin,long,add,数组,define,op From: https://www.cnblogs.com/Dengpc/p/16855612.html