样例过,全wa 线段树定义的结构体,maxh是maxhistory,其他差不多
lazytag1和3是关于最大值的,2和4是不关于最大值的
调了一晚上了没调出来,调出来加我Q:1919363089商议报酬QAQ
(第一个数据点有负数,但输出没有一点负数)
部分结构体的变量写成define了,比如#define tr(p)
云剪切板或下方,谢谢了QAQ蒟蒻硬撑着学的
// Problem: P6242 【模板】线段树 3
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P6242
// Memory Limit: 500 MB
// Time Limit: 3500 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
#define int long long
#define INF 0x7fffffff
#define MAXN 500005
#define MAXM 10003
#define foru(a,b,c) for(int a=b;a<=c;a++)
#define ford(a,b,c) for(int a=b;a>=c;a--)
#define RT return 0;
#define db(x) cout<<endl<<x<<endl;
#define LL long long
#define LXF int
#define RIN rin()
#define HH printf("\n")
#define lz1(p) tr[p].lazytag1
#define lz2(p) tr[p].lazytag2
#define lz3(p) tr[p].lazytag3
#define lz4(p) tr[p].lazytag4
#define tsum(p) tr[p].sum
#define tmax(p) tr[p].maxa
#define tsec(p) tr[p].sec
#define tcnt(p) tr[p].cnt
#define tmah(p) tr[p].maxh
#define tl(p) tr[p].l
#define tr(p) tr[p].r
using namespace std;
inline LXF rin() {
LXF a=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') a=(a<<1)+(a<<3)+c-'0',c=getchar();
return a;
}
inline void out(LXF n){
if(n==0) return;
out(n/10);
putchar(n%10+'0');
}
int n,m,a[MAXN];
struct SegTree{
int l,r,sum,maxa,sec,maxh,cnt;
int lazytag1,lazytag2,lazytag3,lazytag4;
void clear(){
lazytag1=lazytag2=lazytag3=lazytag4=0;
}
}tr[MAXN<<2];
inline int lc(int x){return x<<1;}
inline int rc(int x){return (x<<1)+1;}
inline void push_up(int p){
tsum(p)=tsum(lc(p))+tsum(rc(p));
tmax(p)=max(tmax(lc(p)),tmax(rc(p)));
tmah(p)=max(tmah(p),tmax(p));
if(tmax(lc(p))>tmax(rc(p))){
tsec(p)=max(tsec(lc(p)),tmax(rc(p)));
tcnt(p)=tcnt(lc(p));
}else{
if(tmax(lc(p))==tmax(rc(p))){
tsec(p)=max(tsec(lc(p)),tsec(rc(p)));
tcnt(p)=tcnt(lc(p))+tcnt(rc(p));
}else{
tsec(p)=max(tmax(lc(p)),tsec(rc(p)));
tcnt(p)=tcnt(rc(p));
}
}
}
void build(int p,int l,int r){
tl(p)=l,tr(p)=r;
tr[p].clear();
if(l==r){
tsum(p)=tmax(p)=tmah(p)=a[l];
tcnt(p)=1;
tsec(p)=-2e9;
return ;
}
int mid=(tl(p)+tr(p))>>1;
build(lc(p),tl(p),mid);
build(rc(p),mid+1,tr(p));
push_up(p);
}
void update(int p,int k1,int k2,int k3,int k4){
tsum(p)+=1ll*tcnt(p)*k1+1ll*(tr(p)-tl(p)+1-tcnt(p))*k2;
tmah(p)=max(tmah(p),tmax(p)+k3);
lz3(p)=max(lz3(p),lz1(p)+k3);
lz4(p)=max(lz4(p),lz2(p)+k4);
lz1(p)+=k1,lz2(p)+=k2,tmax(p)+=k1;
if(tsec(p)!=-2e9) tsec(p)+=k2;
}
void push_down(int p){
int maxx=max(tmax(lc(p)),tmax(rc(p)));
if(tmax(lc(p))==maxx) update(lc(p),lz1(p),lz2(p),lz3(p),lz4(p));
else update(lc(p),lz2(p),lz2(p),lz4(p),lz4(p));
if(tmax(rc(p))==maxx) update(rc(p),lz1(p),lz2(p),lz3(p),lz4(p));
else update(rc(p),lz2(p),lz2(p),lz4(p),lz4(p));
tr[p].clear();
}
int qurey_tsum(int p,int nl,int nr){
if(tl(p)>nr||tr(p)<nl) return 0;
if(nl<=tl(p)&&tr(p)<=nr) return tsum(p);
push_down(p);
return qurey_tsum(lc(p),nl,nr)+qurey_tsum(rc(p),nl,nr);
}
int qurey_tmax(int p,int nl,int nr){
if(tl(p)>nr||tr(p)<nl) return -2e9;
if(nl<=tl(p)&&tr(p)<=nr) return tmax(p);
push_down(p);
return max(qurey_tmax(lc(p),nl,nr),qurey_tmax(rc(p),nl,nr));
}
int qurey_tmah(int p,int nl,int nr){
if(tl(p)>nr||tr(p)<nl) return -2e9;
if(nl<=tl(p)&&tr(p)<=nr) return tmah(p);
push_down(p);
return max(qurey_tmah(lc(p),nl,nr),qurey_tmah(rc(p),nl,nr));
}
void modify_add(int p,int nl,int nr,int k){
if(tr(p)<nl||tl(p)>nr) return ;
if(nl<=tl(p)&&tr(p)<=nr){
update(p,k,k,k,k);
return ;
}
push_down(p);
modify_add(lc(p),nl,nr,k);
modify_add(rc(p),nl,nr,k);
push_up(p);
}
void modify_min(int p,int nl,int nr,int k){
if(tr(p)<nl||tl(p)>nr||tmax(p)<=k){
return ;
}
if(nl<=tl(p)&&tr(p)<=nr&&tsec(p)<k){
update(p,k-tmax(p),0,k-tmax(p),0);
return ;
}
push_down(p);
modify_min(lc(p),nl,nr,k);
modify_min(rc(p),nl,nr,k);
push_up(p);
}
signed main(){
n=RIN,m=RIN;
foru(i,1,n) a[i]=RIN;
build(1,1,n);
while(m--){
int op=RIN,x=RIN,y=RIN,k;
switch(op){
case 1:
k=RIN;
modify_add(1,x,y,k);
break;
case 2:
k=RIN;
// cout<<"危"<<endl;
modify_min(1,x,y,k);
break;
case 3:
cout<<qurey_tsum(1,x,y)<<endl;
break;
case 4:
cout<<qurey_tmax(1,x,y)<<endl;
break;
case 5:
cout<<qurey_tmah(1,x,y)<<endl;
break;
}
}
return 0;
}