寿命修改
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

小S养了 n 只青蛙,每只青蛙的初始寿命分别为 a_1, a_2, \cdots, a_n
小S可以对这些青蛙进行两种操作:
  1. 寿命修改:对于区间 [l, r] 内的每只青蛙,将它们的寿命增加 xx 可能为负数)。如果某只青蛙在操作后寿命小于或等于零,那么这只青蛙将永久死亡,之后的所有操作将不会对其产生影响。
  2. 寿命查询:查询区间 [l, r] 内所有活着的青蛙的寿命之和。

输入描述:

第一行包含两个整数 nm1 \le n \le 2 \times 10^51 \le m \le 2 \times 10^5),分别表示青蛙的数量和操作的总数。
第二行包含 n 个整数 a_1, a_2, \cdots, a_n1 \le a_i \le 10^6),表示每只青蛙的初始寿命。
接下来 m 行,每行表示一个操作,格式如下:
  • 1 l r x:表示进行寿命修改操作。保证 1 \le l \le r \le n|x| \le 10^6
  • 2 l r:表示进行寿命查询操作。保证 1 \le l \le r \le n

输出描述:

对于每个寿命查询操作,输出一行一个整数表示答案。
示例1

输入

复制
10 8
96 55 50 35 68 69 18 16 30 78
1 2 9 -22
2 1 10
2 4 7
2 7 8
1 2 7 25
2 3 8
2 1 7
1 3 4 94

输出

复制
349
106
0
234
388