#72. 世界是一颗巨大的线段树

世界是一颗巨大的线段树

题目背景

Y 同学在掌握了基础的线段树(【模板】线段树 1)之后,开始探索其更高级的应用。他发现,线段树不仅能高效地维护区间信息,其树状结构本身还可以用来优化某些查询。为了验证自己的想法,他设计了下面这个问题。

题目描述

给定一个长度为 nn 的数列 {an}\{a_n\},你需要支持以下三种操作:

  1. 1 x y k:将区间 [x,y][x, y] 内的每个数都加上一个整数 kk
  2. 2 x y:查询区间 [x,y][x, y] 内所有数的和。
  3. 3 d:在区间 [1,n][1, n] 中,查询使得前缀和 i=1paid\sum_{i=1}^{p} a_i \ge d 成立的最小的下标 pp。如果不存在这样的 pp,则输出 n+1n+1

输入格式

第一行包含两个整数 n,mn, m,分别表示数列的长度和操作的总个数。

第二行包含 nn 个用空格分隔的整数,其中第 ii 个数字表示数列第 ii 项的初始值 aia_i

接下来 mm 行,每行包含若干个整数,表示一个操作,具体格式如下:

  • 1 x y k:表示一个类型 1 的操作。
  • 2 x y:表示一个类型 2 的操作。
  • 3 d:表示一个类型 3 的操作。

输出格式

对于每个类型 2 和类型 3 的操作,输出一行一个整数,表示查询的结果。

样例

样例输入 #1

5 6
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
3 6

样例输出 #1

11
8
20
2

提示

样例解释

初始数列为 a=[1,5,4,2,3]a = [1, 5, 4, 2, 3]

  1. 2 2 4:查询区间 [2,4][2, 4] 的和,即 5+4+2=115+4+2=11
  2. 1 2 3 2:将 a2,a3a_2, a_3 加上 22。数列变为 a=[1,7,6,2,3]a = [1, 7, 6, 2, 3]
  3. 2 3 4:查询区间 [3,4][3, 4] 的和,即 6+2=86+2=8
  4. 1 1 5 1:将整个数列的每个数加上 11。数列变为 a=[2,8,7,3,4]a = [2, 8, 7, 3, 4]
  5. 2 1 4:查询区间 [1,4][1, 4] 的和,即 2+8+7+3=202+8+7+3=20
  6. 3 6:此时数列为 [2,8,7,3,4][2, 8, 7, 3, 4],我们需要找到最小的 pp 使得前缀和 6\ge 6
    • p=1p=1:前缀和为 22
    • p=2p=2:前缀和为 2+8=102+8=10
    • 10610 \ge 6 成立,且这是第一个满足条件的。因此最小的 pp22。输出 22

数据范围与约定

对于所有测试数据,保证:

  • 1n,m5×1051 \le n, m \le 5 \times 10^5
  • 对于操作 1,有 1xyn1 \le x \le y \le n109k109-10^9 \le k \le 10^9
  • 对于操作 2,有 1xyn1 \le x \le y \le n
  • 对于操作 3,有 1018d1018-10^{18} \le d \le 10^{18}
  • 初始时,109ai109-10^9 \le a_i \le 10^9
  • 保证在任意时刻,数列中所有元素的绝对值之和不超过 101810^{18}