#2669. 线段树历史和

线段树历史和

题目描述

维护一个长度为 nn 的数列 aa,支持两种操作:

  • 区间加上一个数字 xx
  • 查询区间的历史和。

历史和定义为数列 hih_i 的区间和:初始 hi=aih_i=a_i,在每次操作(修改或查询,具体可参考样例解释)完成后,对所有 hihi+aih_i \leftarrow h_i+a_i

输入格式

第一行两个数 n,mn, m,表示长度为 nn 的有序序列和 mm 个操作。 第二行有 nn 个数,表示有序序列 aia_i

下面有 mm 行,每行第一个数表示操作类型:

  • 之后有三个数 l,r,xl, r, x 表示将在区间 [l,r][l,r] 之间的值都加上 xx
  • 之后有两个数 l,rl, r 表示查询区间 [l,r][l, r] 的历史和。

输出格式

对于每个操作 22 各输出一行,表示查询结果。

5 6
5 2 13 12 9
2 3 5
1 1 3 17
2 1 2
2 1 4
2 4 5
1 4 5 9
34
55
230
105

样例 1 解释

初始 hh 序列为 {5,2,13,12,9}\{5, 2, 13, 12, 9\}

操作 2 3 5 虽然是询问操作,但仍然会更新 hihi+aih_i \leftarrow h_i+a_i,更新结果为:{10,4,26,24,18}\{10, 4, 26, 24, 18\}。注意更新在回答询问之后,即询问仍然是更新前 hh 的区间和。

操作 1 1 3 17 之后,序列 aa{22,19,30,12,9}\{22, 19, 30, 12, 9\}hh 更新后为 {32,23,56,36,27}\{32, 23, 56, 36, 27\}

操作 2 1 2 即求此时的 h1+h2h_1+h_2,答案即为 32+23=5532+23=55。回答完该询问后更新 hh,更新结果为 {54,42,86,48,36}\{54, 42, 86, 48, 36\}

10 10
8 9 2 6 2 8 8 3 10 6
1 7 9 8
2 2 6
2 1 8
2 8 10
1 3 8 10
2 5 8
2 8 9
1 8 9 1
2 5 10
2 5 6
54
170
124
246
207
687
200

数据规模与约定

  • 对于 15%15\% 的数据,n,m20n,m \leq 20
  • 对于 50%50\% 的数据,n,m3000n,m \leq 3000
  • 对于 100%100\% 的数据,1n,m105,1000ai,x10001 \leq n,m \leq 10^5, -1000 \leq a_i,x \leq 1000