1346测试点过了,其他的测试点问题不是很大,总是在比较靠后的位置出错,初步判断是5操作出现了问题,但是不知道咋改呀,救救孩子吧
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 2147483646
using namespace std;
struct tree{
int l,r,mx,mn,cmx,cmn,tmx,tmn,tad,smx,smn,mxb;
long long sum;
}t[2000001];
int a[1000001];
inline void pushup(int root){
int ls=root*2,rs=root*2+1;
t[root].sum=t[ls].sum+t[rs].sum;
t[root].mxb=max(t[ls].mxb,t[rs].mxb);
if(t[ls].mx==t[rs].mx){
t[root].mx=t[ls].mx;t[root].cmx=t[ls].cmx+t[rs].cmx;
t[root].smx=max(t[ls].smx,t[rs].smx);
}else if(t[ls].mx>t[rs].mx){
t[root].mx=t[ls].mx;t[root].cmx=t[ls].cmx;
t[root].smx=max(t[ls].smx,t[rs].mx);
}else{
t[root].mx=t[rs].mx;t[root].cmx=t[rs].cmx;
t[root].smx=max(t[ls].mx,t[rs].smx);
}
}
inline void pushadd(int root,int v){
t[root].sum+=(t[root].r-t[root].l+1ll)*v;
t[root].mx+=v,t[root].mn+=v;
t[root].mxb=max(t[root].mxb,t[root].mx);
if(t[root].smx!=-inf) t[root].smx+=v;
if(t[root].smn!=inf) t[root].smn+=v;
if(t[root].tmx!=-inf) t[root].tmx+=v;
if(t[root].tmn!=inf) t[root].tmn+=v;
t[root].tad+=v;
}
inline void pushmin(int root,int v){
if(t[root].mx<=v) return ;
t[root].sum+=(v*1ll-t[root].mx)*t[root].cmx;
if(t[root].mn==t[root].mx) t[root].mn=v;
if(t[root].smn==t[root].mx) t[root].smn=v;
if(t[root].tmx>v) t[root].tmx=v;
t[root].mx=v;t[root].tmn=v;
}
inline void pushmax(int root,int v){
if(t[root].mn>v) return ;
t[root].sum+=(v*1ll-t[root].mn)*t[root].cmn;
if(t[root].mx==t[root].mn) t[root].mx=v;
if(t[root].smx==t[root].mn) t[root].smx=v;
if(t[root].tmn<v) t[root].tmn=v;
t[root].mn=v;t[root].tmx=v;
}
inline void pushdown(int root){
int mid=(t[root].l+t[root].r)/2;
if(t[root].tad){
pushadd(root*2,t[root].tad),pushadd(root*2+1,t[root].tad);
}
if(t[root].tmx!=-inf) pushmax(root*2,t[root].tmx),pushmax(root*2+1,t[root].tmx);
if(t[root].tmn!=inf) pushmin(root*2,t[root].tmn),pushmin(root*2+1,t[root].tmn);
t[root].tad=0,t[root].tmx=-inf,t[root].tmn=inf;
}
inline void build(int bg,int en,int root){
t[root].l=bg,t[root].r=en,t[root].tmx=-inf,t[root].tmn=inf;
if(bg==en){
t[root].sum=t[root].mx=t[root].mn=t[root].mxb=a[bg];
t[root].smx=-inf,t[root].smn=inf;
t[root].cmx=t[root].cmn=1;
return ;
}
int mid=(bg+en)/2;
build(bg,mid,root*2);
build(mid+1,en,root*2+1);
pushup(root);
}
inline void add(int bg,int en,int root,int ad){
if(bg<=t[root].l&&en>=t[root].r){
return pushadd(root,ad);
}
int mid=(t[root].l+t[root].r)/2;
pushdown(root);
if(bg<=mid) add(bg,en,root*2,ad);
if(en>mid) add(bg,en,root*2+1,ad);
pushup(root);
}
inline void tomin(int bg,int en,int root,int v){
if(t[root].l>en||t[root].r<bg||t[root].mx<=v) return ;
if(bg<=t[root].l&&en>=t[root].r&&t[root].smx<v){
return pushmin(root,v);
}
int mid=(t[root].l+t[root].r)/2;
pushdown(root);
tomin(bg,en,root*2,v);
tomin(bg,en,root*2+1,v);
pushup(root);
}
inline long long querysum(int bg,int en,int root){
if(t[root].l>en||t[root].r<bg) return 0;
if(bg<=t[root].l&&en>=t[root].r){
return t[root].sum;
}
int mid=(t[root].l+t[root].r)/2;
pushdown(root);
return querysum(bg,en,root*2)+querysum(bg,en,root*2+1);
}
inline int qmaxa(int bg,int en,int root){
if(t[root].l>en||t[root].r<bg) return -inf;
if(bg<=t[root].l&&en>=t[root].r){
return t[root].mx;
}
int mid=(t[root].l+t[root].r)/2;
pushdown(root);
return max(qmaxa(bg,en,root*2),qmaxa(bg,en,root*2+1));
}
inline int qmaxb(int bg,int en,int root){
if(t[root].l>en||t[root].r<bg) return -inf;
if(bg<=t[root].l&&en>=t[root].r){
return t[root].mxb;
}
int mid=(t[root].l+t[root].r)/2;
pushdown(root);
return max(qmaxb(bg,en,root*2),qmaxb(bg,en,root*2+1));
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,n,1);
for(int i=0;i<m;i++){
int opt,u,v,w;
scanf("%d%d%d",&opt,&u,&v);
if(opt==1){
scanf("%d",&w);
add(u,v,1,w);
}else if(opt==2){
scanf("%d",&w);
tomin(u,v,1,w);
}else if(opt==3){
printf("%lld\n",querysum(u,v,1));
}else if(opt==4){
printf("%d\n",qmaxa(u,v,1));
}else{
printf("%d\n",qmaxb(u,v,1));
}
}
return 0;
}