题号:NC226598
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述
智乃酱最近在学习势能线段树
对于势能线段树,假设线段树的节点数为

,操作数目为

。
若势能可被某种操作重置或者增加,则必须考虑最坏情况下能够提供操作总数

*|单次操作重置势能的节点总数|*|节点势能上限|的时间复杂度。
则势能线段树则总时间复杂度为
%7D)
。
一般来讲,在使用lazy_tag的情况下, |线段树单次操作影响到的节点数目|就是

,本题中节点势能上限近似是个

(其实是6)所以总复杂度是

级别的。
使用势能线段树时要定义势能、势能初始值(势能最大值)、0势能点。
本题中有两种可以定义势能与0势能的方法,你可以都尝试一下。
- 定义区间开根次数cnt为势能,势能初始值为势能上限=6,定义0势能点为cnt=0,但是此方法重置势能比较困难,强烈不推荐使用。
- 定义区间最大值max与区间最小值min的差值diff为势能,势能初始值为差值diff,定义0势能点为diff=0。
--------------------------------------------------------------------------------------------------------------------------
给你一个长度大小为

的正整数数组,进行

次操作,操作有下列两种。
- 给定区间
对区间中所有数字开根号向下取整,即
。 - 给定区间
,对区间中每个数字加上一个正整数
。
- 查询给定区间
的元素和,即求
。
输入描述:
第一行输入两个正整数
%7D)
。
接下来一行输入

个正整数
%7D)
。
接下来

行,每行首先输入一个正整数
%20%7D)
。
当

时,表示操作一,然后继续输入两个正整数
)
表示对

区间开根号向下取整。
当

时,表示操作二,然后继续输入三个正整数
)
表示给区间

加上一个正整数

。
当

时,表示操作二,然后继续输入两个正整数
)
表示求区间

的区间和。
输出描述:
对于每一个当
,输出区间和。
示例1
输入
复制
10 3
10 10 10 10 10 10 10 10 10 10
3 1 10
1 1 5
3 1 10
示例2
输入
复制
10 3
10 10 10 10 10 10 10 10 10 10
1 1 5
2 1 10 5
3 1 10