树状数组的区间修改单点查询

树状数组其实本质还单点修改区间查询,但是我们怎么延伸到这个呢,我们建立一个差分数组,

比如:                a[10]={4, 6, 7, 5, 1, 6, 3, 4, 2, 7}

对应的差分数组  c[10]={4, 2,1,-2,-4, 5,-3, 1,-2, 5}

c[i]=a[i]-a[i-1]

然后c[4]=a[0]+a[1]+a[2]+a[3]

我们当前的那个c[i]变量就等于前i项a[i]和

我们就按之区间查询单点修改的方法把这个c数组存下来

如果我们把[l,r]区间的值都加上num的话我们实际上只要把c数组的c[l]+=num,c[r+1]-=num;

这个是怎么来的呢,举个例子 1 3 5 7 9

       对应的c数组  1  2 2 2 2

我们把[2,3]都加个2,对应的两个数组就变为

             1  5  7 9 9

              1 4  2  2  0

因为中间都加的是一样的数,所以只要修改两端就行

 但是我们核心还是树状数组,所以我们之前包含要修改的数的区间都要修改

所以和之前的单点修改一样了,只是区间[l,r]树状数组只能修改[l,n],[r+1,n]

我们就先用[l,n]都加上num,然后[r+1,n]都减个num

所以我们实现代码就也很简单了,就是插数的时候用add(l,num) add(r+1,-num)

找a[i]的时候就是sum(i)