树状数组 代码

      转自博客 : 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;
}

    

posted @ 2019-01-14 09:37  快乐的黄鳝  阅读(105)  评论(0编辑  收藏  举报