在BIT中,B[x]维护的区间是[x-lowbit(x)+1,x]。
先说查询,要查询区间[1,x],首先查B[x]得到[x-lowbit(x)+1,x]的信息,然后执行y=x-lowbit(x),得到[y-lowbit(y)+1,x-lowbit(x)]的信息,一直执行减去lowbit的操作直到x归零再将所有区间合并,即可不重不漏地获得[1,x]区间。
然后是维护,首先肯定要维护B[x],然后这里说一个结论,除开B[x]其他包含x信息的区间对应的B数组下标,必然是将x的某一位0(设这个位为c位)变为1,然后c位的更高位不变,c位的更低位全变成0,下面说明:
假设y所代表的区间[y-lowbit(y)+1,y]包含x,那么意味着y-lowbit(y)<=x且y>=x。
如果c位的更高位由0变1,那么必然y-lowbit(y)>x,所以不行。
如果c位的更高位由1变0,那么必然y<x,所以不行。
如果c位的更低位有任何1,那么必然y-lowbit(y)>x,所以也不行。
上述位操作看着复杂,其实只要不停地执行x+=lowbit(x)就行。