转自博客 : https://www.cnblogs.com/fuyun-boy/p/5913438.html
#include<iostream> #include<algorithm> #include<string> using namespace std; #define MAX 500000 int N,M; int a[MAX],c[MAX]; //====================================================== void init();// void ADD(int ,int );// int sum(int ); //====================================================== void ADD(int x,int y) { for(int i=x;i<=N;i+=i&(-i) ){ c[i]+=y; } } //====================================================== int sum(int x) { int SUM=0; for(int i=x;i>=1;i-=i&(-i)) SUM+=c[i]; return SUM; } //====================================================== void init() { int aa,bb,cc; cin>>N>>M; for(int i=1;i<=N;i++){ cin>>a[i]; ADD( i , a[i] ); } for(int i=1;i<=M;i++){ cin>>aa>>bb>>cc; if(aa==1)ADD(bb,cc); if(aa==2)cout<<sum(cc)-sum(bb-1)<<endl; } } //====================================================== int main() { init(); return 0 ; }
转自博客:https://www.cnblogs.com/acgoto/p/8583952.html
int lowbit(int i) { return i & -i;//或者是return i-(i&(i-1));表示求数组下标二进制的非0最低位所表示的值 } void update(int i,int val)//单点更新 { while(i<=n){ C[i]+=val; i+=lowbit(i);//由叶子节点向上更新树状数组C,从左往右更新 } } int sum(int i)//求区间[1,i]内所有元素的和 { int ret=0; while(i>0){ ret+=C[i];//从右往左累加求和 i-=lowbit(i); } return ret; }