Problem Description
There is a sequence a of length n. We use ai to denote the i-th element in this sequence. You should do the following three types of operations to this sequence.
0 x y t: For every x≤i≤y, we use min(ai,t) to replace the original ai’s value.
1 x y: Print the maximum value of ai that x≤i≤y.
2 x y: Print the sum of ai that x≤i≤y.
Input
The first line of the input is a single integer T, indicating the number of testcases.
The first line contains two integers n and m denoting the length of the sequence and the number of operations.
The second line contains n separated integers a1,…,an (∀1≤i≤n,0≤ai<231).
Each of the following m lines represents one operation (1≤x≤y≤n,0≤t<231).
It is guaranteed that T=100, ∑n≤1000000, ∑m≤1000000.
Output
For every operation of type 1 or 2, print one line containing the answer to the corresponding query.
Sample Input
1
5 5
1 2 3 4 5
1 1 5
2 1 5
0 3 5 3
1 1 5
2 1 5
Sample Output
5
15
3
12
解题报告
我们对于线段树的每个结点,维护最大值max,最大值出现次数cnt,严格次大值sec和区间和sum。
修改时,对于可修改结点k,若
t≥max(k):修改对于该区间无效,返回。
sec(k) < t < max(k):t只对max(k)发生影响,令max(k)=t并更新区间和,返回。
sec(k) ≤ t:无法简单地更新区间和了……
复杂度是 (mlog n),证明的话可以参看16年集训队吉爷的论文
这个题要优化输入输出,否则可能超时
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX_N 1000005
using namespace std;
typedef long long LL;
const int MAXS = 40*1024*1024;
char buf[MAXS],bufout[MAXS],*ch,*chout;
void read(int &x){
for(++ch;*ch<=32;++ch);
for(x=0;*ch>=