#72. 世界是一颗巨大的线段树
世界是一颗巨大的线段树
题目背景
Y 同学在掌握了基础的线段树(【模板】线段树 1)之后,开始探索其更高级的应用。他发现,线段树不仅能高效地维护区间信息,其树状结构本身还可以用来优化某些查询。为了验证自己的想法,他设计了下面这个问题。
题目描述
给定一个长度为 的数列 ,你需要支持以下三种操作:
1 x y k
:将区间 内的每个数都加上一个整数 。2 x y
:查询区间 内所有数的和。3 d
:在区间 中,查询使得前缀和 成立的最小的下标 。如果不存在这样的 ,则输出 。
输入格式
第一行包含两个整数 ,分别表示数列的长度和操作的总个数。
第二行包含 个用空格分隔的整数,其中第 个数字表示数列第 项的初始值 。
接下来 行,每行包含若干个整数,表示一个操作,具体格式如下:
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
提示
样例解释
初始数列为 。
2 2 4
:查询区间 的和,即 。1 2 3 2
:将 加上 。数列变为 。2 3 4
:查询区间 的和,即 。1 1 5 1
:将整个数列的每个数加上 。数列变为 。2 1 4
:查询区间 的和,即 。3 6
:此时数列为 ,我们需要找到最小的 使得前缀和 。- :前缀和为 。
- :前缀和为 。
- 成立,且这是第一个满足条件的。因此最小的 为 。输出 。
数据范围与约定
对于所有测试数据,保证:
- 对于操作 1,有 ,。
- 对于操作 2,有 。
- 对于操作 3,有 。
- 初始时,。
- 保证在任意时刻,数列中所有元素的绝对值之和不超过 。