题目:
已知一个数列,你需要进行下面两种操作:将某一个数加上 x,求出某区间每一个数的和。输入:第一行包含两个正整数 n,m,分别表示该数列数字的个数和操作的总个数。第二行包含 n 个用空格分隔的整数,其中第 i个数字表示数列第 i项的初始值。接下来 m 行每行包含 3个整数,表示一个操作。1 x k 含义:将第 x个数加上 k;2 x y 含义:输出区间 [x,y]内每个数的和。
思路:
1.整体思路:
(1)构建树状数组:build
(2)单点修改:add
(3)区间查询;search
2.具体思路:
(1)构建树状数组(目的:为了更好地储存一段数列)
将整个数列按照123······n进行编号。
设:n等于7,构造出的树状数组如下图所示。
(2)单点修改(对数列中第x个数加上k)
从根结点出发,判断编号x在父节点的左儿子里还是右儿子里,然后继续往下查询,直到找到了叶结点,那它就是x序号无疑了。
如图所示,从区间1-4中找到序号2。
(3)区间查询(查询序号x到序号y对应的数值的和)
- 若区间包含于目标区间,直接返回;
- 若左儿子与目标区间有交集查询左儿子;
- 若右儿子与目标区间有交集查询右儿子;
如图所示,从区间1-4中查询区间2-3
代码展示: