树状数组1(单点修改,区间查询):
#include<cstdio> #include<iostream> using namespace std; int n,c[500010]; int lowbit(int x){ return x&-x; } void add(int x,int k){ for(;x<=n;x+=lowbit(x))c[x]+=k; } int sum(int x,int y){ int ans=0; for(;y;y-=lowbit(y)){ ans+=c[y]; } for(x--;x;x-=lowbit(x)){ ans-=c[x]; } return ans; } int main(){ int m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int k; scanf("%d",&k); add(i,k); } for(int i=1;i<=m;i++){ int ta,x,y; scanf("%d%d%d",&ta,&x,&y); if(ta==1){ add(x,y); }else if(ta==2){ cout<<sum(x,y)<<endl; } } return 0; }
树状数组2(区间修改,单点查询):
#include<cstdio> #include<iostream> #define lowbit(x) x&-x using namespace std; long long c[500005]; int n,m; void add(int x,int num){ for(;x<=n;x+=lowbit(x))c[x]+=num; } long long query(int x){ long long ans=0; for(;x;x-=lowbit(x))ans+=c[x]; return ans; } int main(){ scanf("%d%d",&n,&m); long long last=0,now; for(int i=1;i<=n;i++){ scanf("%lld",&now); add(i,now-last); last=now; } for(int i=1;i<=m;i++){ int flg; scanf("%d",&flg); if(flg==1){ int x,y,k; scanf("%d%d%d",&x,&y,&k); add(x,k); add(y+1,-k); }else if(flg==2){ int x; scanf("%d",&x); printf("%lld\n",query(x)); } } return 0; }