小苯的数组操作
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}小苯拿到了一个长度为 n 的数组 a_1,a_2,\dots,a_n,小红希望小苯在 a 上维护一些操作,具体地:
\hspace{23pt}\bullet\,操作一:给出下标 x\left(1 \leqq x \leqq n\right),表示将第 x 个前缀(即 a_1,a_2,\dots,a_x)全部变为他们的最小值,即:\min(a_1,a_2,\dots,a_x)
\hspace{23pt}\bullet\,操作二:给出下标 y\left(1 \leqq y \leqq n\right),表示将第 y 个后缀(即 a_y,a_{y+1},\dots,a_n)全部变为他们的最小值,即:\min(a_y,a_{y+1},\dots,a_n)
\hspace{23pt}\bullet\,操作三:查询目前 a 中所有元素的和。
\hspace{15pt}你的任务就是帮小苯维护这些操作,并回答所有的操作三。

输入描述:

\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\ (1\leqq T\leqq 10^5) 代表数据组数,每组测试数据描述如下:

\hspace{15pt}第一行输入两个正整数 n, q\left(1 \leqq n, q \leqq 3 \times 10^5\right),分别表示数组的长度、操作的次数。
\hspace{15pt}第二行输入 n 个整数 a_i\left(1 \leqq a_i \leqq 10^9\right),表示数组中的各个元素。
\hspace{15pt}此后 q 行,第 i 行先输入一个整数 o_i\left(1 \leqq o_i \leqq 3\right),表示第 i 次操作的类型,编号同题干。随后在同一行:
\hspace{23pt}\bullet\,o_i=1,输入一个整数 x_i\left(1 \leqq x_i \leqq n\right),表示操作的参数。
\hspace{23pt}\bullet\,o_i=2,输入一个整数 y_i\left(1 \leqq y_i \leqq n\right),表示操作的参数。

\hspace{15pt}除此之外,保证单个测试文件的 n 之和、q 之和均不超过 3 \times 10^5,且至少存在一次操作三。

输出描述:

\hspace{15pt}对于每一次操作三,新起一行输出一个整数,表示当前数组中所有元素的和。
示例1

输入

复制
1
8 4
6 2 4 1 5 3 4 6
1 2
3
2 6
3

输出

复制
27
23

说明

\hspace{15pt}在这个样例中:
\hspace{23pt}\bullet\,进行第一次操作后,a=\{{\color{orange}{2}},{\color{orange}{2}},4,1,5,3,4,6\},因此总和为:27
\hspace{23pt}\bullet\,进行第二次操作后,a=\{2,2,4,1,5,{\color{orange}{3}},{\color{orange}{3}},{\color{orange}{3}}\},因此总和为:23