代码只有90,wa了第三个点
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
#define int long long
inline int read(){
char ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
int num = 0;
while(ch >= '0' && ch <= '9'){
num = (num << 3) + (num << 1) + ch - '0';
ch = getchar();
}
return num;
}
int n , q , tree[maxn << 2] , lazy[maxn << 2][2] , a[maxn];
#define lc rt << 1
#define rc rt << 1 | 1
#define lson lc , l , mid
#define rson rc , mid + 1 , r
#define Ql lson , ql , qr
#define Qr rson , ql , qr
#define half (l + r) >> 1
#define myself rt , l , r
void pushup(int rt){
tree[rt] = max(tree[lc] , tree[rc]);
}
void build(int rt , int l , int r){
lazy[rt][1] = lazy[rt][0] = 0;
if(l == r){
tree[rt] = a[l];
//printf("%d -- %d\n" , rt , a[l]);
return;
}
int mid = half;
build(lson);
build(rson);
pushup(rt);
}
void pushdown(int rt , int l , int r){
if(lazy[rt][1]) {
tree[lc] = lazy[rt][1];
tree[rc] = lazy[rt][1];
lazy[lc][1] = lazy[rt][1];
lazy[lc][0] = 0;
lazy[rc][1] = lazy[rt][1];
lazy[rc][0] = 0;
lazy[rt][1] = 0;
}
if(lazy[rt][0]){
tree[lc] += lazy[rt][0];
tree[rc] += lazy[rt][0];
lazy[lc][0] += lazy[rt][0];
lazy[rc][0] += lazy[rt][0];
lazy[rt][0] = 0;
}
}
void update(int rt , int l , int r , int ql , int qr , int op , int val){
if(ql <= l && qr >= r){
if(op == 1){
lazy[rt][1] = val;
lazy[rt][0] = 0;
tree[rt] = val;
}
else {
lazy[rt][0] += val;
tree[rt] += val;
}
return ;
}
int mid = half;
pushdown(myself);
if(ql > mid) update(Qr , op , val);
else if(qr <= mid) update(Ql , op , val);
else {
update(Qr , op , val);
update(Ql , op , val);
}
pushup(rt);
}
int query(int rt , int l , int r , int ql , int qr){
if(ql <= l && qr >= r) return tree[rt];
pushdown(myself);
int mid = half;
if(ql > mid) return query(Qr);
else if(qr <= mid) return query(Ql);
else return max(query(Ql) , query(Qr));
}
signed main(){
n = read();
q = read();
for(int i = 1 ; i <= n ; i ++) scanf("%lld" , &a[i]);
build(1 , 1 , n);
//for(int i = 1 ; i <= 11 ; i ++) printf("%d -- %d\n" , i , tree[i]);
for(int i = 1 , op , l , r , val; i <= q ; i ++){
op = read();
l = read();
r = read();
if(op == 1) {
scanf("%lld" , &val);
update(1 , 1 , n , l , r , 1 , val);
}
else if(op == 2){
scanf("%lld" , &val);
update(1 , 1 , n , l , r , 2 , val);
}
else printf("%lld\n" , query(1 , 1 , n , l , r));
}
return 0;
}