先谈一下线段树和树状数组的关系:
1.二者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度也远小于线段树.
2.树状数组的作用被线段树完全涵盖, 凡是可以使用树状数组解决的问题, 使用线段树一定可以解决, 但是线段树能 够解决的问题树状数组未必能够解决.
树状数组的突出特点是其编程的极端简洁性, 使用lowbit技术可以在很短的几步操作中完成树状数组的核心操作,与之相关的便是其代码效率远高于线段树。
下面简单剖析一下树状数组:

"C[i]表示A[i-2^k+1]到A[i]的和"
1.我们可以这么理解,在数组c[i]中,2.k 是i 在二进制时末尾0 的个数,2^k即是最小位的数值
例如i=101000,k=3,最小位是2^k=2^3=8
code:
求t的最小位的数值
int Lowbit(int t)
{
return t & ( t ^ ( t - 1 ) );
}void add(int i,int t)
{
while(i<=n)
{
tree[i]+=t;
i+=lowbit(i);
}
}求所有树状数组的和
int sum(int m)
{
int sum=0;
while(m>0)
{
sum+=tree[m];
m-=lowbit(m);
}
return sum;
}原文:http://blog.csdn.net/holyang_1013197377/article/details/41980569