树状数组的模板

来源:互联网 发布:商友软件 编辑:程序博客网 时间:2024/05/17 03:06
//树状数组的模板;int lowbit(int i){return i&(-i);}//lowbit(i)=2^k(其中k为i在二进制下末尾0的个数)//下面的代码给原数组的下标为pos的位置上的元素a[pos]加上一个数num;void  update(int pos,int num){while(pos<=n){//n为元素的个数 c[pos]=c[pos]+num;pos+=lowbit(pos);}} //计算原数组A[1]到a[x]的和;int sum(int x){int sum=0;while(x>0){sum+=c[x];x-=lowbit[x];}return sum;} //二维树状数组//作用:用于快速求数字的子矩阵的和;void uodate (int i,int j,int k){//给a[i][j]加上k      while(i<=n){     int temp=j;     while(temp<=n){     c[i][temp]+=k;     temp+=lowbit(temp); } i+=lowbit(i); }} int sum(int i,int j){//查询a[1][1]到a[i][j]的和       int sum=0;   while(i>0){    int temp=j;    while(temp>0){            sum+=c[i][temp];            temp-=lowbit(temp);}i-=lowbit(i);   }    return sum;}