写的是第5,6个点(没有取min操作的)。
目前是 RE。
using namespace std;
typedef long long ll;
#define int long long
const int MAXN = 1e6 + 5;
int n, m;
namespace Seg_Tr{
struct Tag{
ll add, add_h;
};
struct node{
ll sum, mx, mx_h;
Tag tag;
} a[MAXN * 4];
const int INF = 0x3f3f3f3f;
#define mid ((l + r) >> 1)
#define p a[x]
#define ls (x << 1)
#define rs ((x << 1) | 1)
#define pls a[ls]
#define prs a[rs]
bool in(int l, int r, int ql, int qr) {return ql <= l && r <= qr;}
bool out(int l, int r, int ql, int qr) {return r < ql || qr < l;}
void push_up(int x){
p.sum = pls.sum + prs.sum;
p.mx = max(pls.mx, prs.mx);
p.mx_h = max(pls.mx_h, prs.mx_h);
}
void push_down(int x, int l, int r){
if(l == r) return;
pls.sum += 1ll * p.tag.add * (mid - l + 1);
prs.sum += 1ll * p.tag.add * (r - mid);
pls.mx_h = max(pls.mx_h, pls.mx + p.tag.add_h);
prs.mx_h = max(prs.mx_h, prs.mx + p.tag.add_h);
pls.mx += p.tag.add;
prs.mx += p.tag.add;
pls.tag.add_h = max(pls.tag.add_h, pls.tag.add + p.tag.add_h);
prs.tag.add_h = max(prs.tag.add_h, prs.tag.add + p.tag.add_h);
pls.tag.add += p.tag.add;
prs.tag.add += p.tag.add;
p.tag.add = p.tag.add_h = 0;
}
void build(int x, int l, int r){
if(l == r){
scanf("%lld", &p.sum);
p.mx = p.mx_h = p.sum;
return;
}
build(ls, l, mid);
build(rs, mid + 1, r);
push_up(x);
}
void mod_add(int x, int l, int r, int ql, int qr, ll v){
push_down(x, l, r);
if(in(l, r, ql, qr)){
p.sum += v * (r - l + 1);
p.mx += v;
p.mx_h = max(p.mx_h, p.mx);
p.tag.add += v;
p.tag.add_h = max(p.tag.add_h, p.tag.add);
return;
}
if(out(l, r, ql, qr)) return;
mod_add(ls, l, mid, ql, qr, v);
mod_add(qr, mid + 1, r, ql, qr, v);
push_up(x);
}
ll qry_sum(int x, int l, int r, int ql, int qr){
push_down(x, l, r);
if(in(l, r, ql, qr)) return p.sum;
if(out(l, r, ql, qr)) return 0;
return qry_sum(ls, l, mid, ql, qr) + qry_sum(rs, mid + 1, r, ql, qr);
}
ll qry_max(int x, int l, int r, int ql, int qr){
push_down(x, l, r);
if(in(l, r, ql, qr)) return p.mx;
if(out(l, r, ql, qr)) return -INF;
return max(qry_max(ls, l, mid, ql, qr), qry_max(rs, mid + 1, r, ql, qr));
}
ll qry_max_h(int x, int l, int r, int ql, int qr){
// printf("%d %d %d %d %d mx = %d, mx_h = %d\n", x, l, r, ql, qr, p.mx, p.mx_h);
push_down(x, l, r);
if(in(l, r, ql, qr)) return p.mx_h;
if(out(l, r, ql, qr)) return -INF;
return max(qry_max_h(ls, l, mid, ql, qr), qry_max_h(rs, mid + 1, r, ql, qr));
}
#undef mid
#undef p
#undef ls
#undef rs
#undef pls
#undef prs
} // Seg_Tr
signed main(){
scanf("%lld%lld", &n, &m);
Seg_Tr::build(1, 1, n);
while(m--){
int op; scanf("%lld", &op);
if(op == 1){
int l, r; ll v; scanf("%lld%lld%lld", &l, &r, &v);
Seg_Tr::mod_add(1, 1, n, l, r, v);
}
if(op == 2){
assert(0);
}
if(op == 3){
int l, r; scanf("%lld%lld", &l, &r);
printf("%lld\n", Seg_Tr::qry_sum(1, 1, n, l, r));
}
if(op == 4){
int l, r; scanf("%lld%lld", &l, &r);
printf("%lld\n", Seg_Tr::qry_max(1, 1, n, l, r));
}
if(op == 5){
int l, r; scanf("%lld%lld", &l, &r);
printf("%lld\n", Seg_Tr::qry_max_h(1, 1, n, l, r));
}
}
return 0;
}