模板

模板一:单点修改,区间求和

#define lowbit(x) x&(-x)
const int maxn=100010;
int n,bit[2*maxn];

int query(int x){
	int s=0;
	while(x>0){
		s+=bit[x];
		x-=lowbit(x);
	}
	return s;
}

void change(int x,int v){
	while(x<=n){
		bit[x]+=v;
		x+=lowbit(x);
	}
}

模板二:区间修改,单点查询
    将原数组存储成差分数组,根据差分的性质,在区间[l,r]上同时加上x可以处理成:
    (change(l,x))
    (change(r+1,-x))
    查询下标为i的元素值可以处理成:
    (query(i))
模板三:区间修改,区间求和
    设置两个BIT,bit0和bit1
    (sum_{j=1}^{i}a_j=query(bit1,i) imes i+query(bit0,i))
    在区间[l,r]上同时加上x可以处理成:
    (change(bit0,l,-x*(l-1)))
    (change(bit1,l,x))
    (change(bit0,r+1,x*r))
    (change(bit1,r+1,-x))
    区间[l,r]的求和可以处理成:
    (query(bit1,r)*r+query(bit0,r)-(query(bit1,l-1)*(l-1)+query(bit0,l-1)))

原文地址:https://www.cnblogs.com/fxq1304/p/13072725.html