一维:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; long long n,con; long long a[500005]; long long e[500005]={0}; long long lowbit(long long num){ return (-num)# } void change(int pos,long long val){ int now=pos; for(;now<=n;now+=lowbit(now)){ e[now]+=val; } } long long getans(int pos){ if(pos==0){ return 0; } long long sum=0; int now=pos; for(;now>=1;now-=lowbit(now)){ sum+=e[now]; } return sum; } int main(){ cin>>n>>con; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); change(i,a[i]); } for(int i=1;i<=con;i++){ long long type,x,y; scanf("%lld%lld%lld",&type,&x,&y); if(type==1){//更改 change(x,y); }else if(type==2){//询问 if(x>y){ swap(x,y); } printf("%lld\n",getans(y)-getans(x-1));//获取区间总和 } } return 0; }
可以参考以下内容,讲的不错。
(lowbit证明)http://www.mamicode.com/info-detail-1270028.html
https://pks-loving.blog.luogu.org/senior-data-structure-gao-ji-shuo-ju-jie-gou-chu-bu-yang-xie-fen-kuai