一维树状数组
#define lowbit(x) ((x)&(-x))
#define M 1004 //线段的长度或处理的个数
int maxn,c[M];
void update(int p,int d)
{
while(p<=maxn){
c[p]+=d;
p+=lowbit(p);
}
}
int sum(int p)
{
int ans=0;
while(p>0){
ans+=c[p];
p-=lowbit(p);
}
return ans;
}
二维树状数组
#define lowbit(x) ((x)&(-x))
#define M 1004
int maxr,maxc,c[M][M];
void update(int p,int q,int d)
{
int qq=q; //保存初值
for(;p<=maxr;p+=lowbit(p))
for(q=qq;q<=maxc;q+=lowbit(q))
c[p][q]+=d;
}
int sum(int p,int q)
{
int ans=0,qq=q;
for(;p>0;p-=lowbit(p))
for(q=qq;q>0;q-=lowbit(q))
ans+=c[p][q];
return ans;
}