应该是码风清奇,通俗易懂了。
1,2,5,7,8WA。9,10TLE。3,4,6AC
要去睡觉了,离线等
#include<bits/stdc++.h>
#define int long long
#define MAX 8e18
using namespace std;
const int N = 4e6+5,M=123456555566667;
int read(){
int x=0ll,f=1ll;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int n,m;
int a[N];
struct qwq{
int l,r;
int sum,lazy; // 区间和,懒标记
int fz; //区间赋值 M为原始状态
int minn,maxx,oldm;//最小,最大值,历史最大值
qwq(){
l=r=0ll;
sum=lazy=oldm=0ll;
fz=M; minn=MAX; maxx=-MAX;
}
void color(int v,int bk){
int len=r-l+1;
if(bk!=M){
oldm=max(oldm,bk);
lazy=0ll;
sum=bk*len;
minn=maxx=fz=bk;
}
sum=(sum+v*len);
lazy+=v; minn+=v; maxx+=v;
oldm=max(maxx,oldm);
}
}t[N];
qwq operator+(const qwq &a,const qwq &b){
qwq c;
c.l=a.l; c.r=b.r;
c.sum=(a.sum+b.sum);
c.minn=min(a.minn,b.minn);
c.maxx=max(a.maxx,b.maxx);
c.oldm=max(a.oldm,b.oldm);
return c;
}
void build(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].maxx=t[p].minn=
t[p].sum=t[p].oldm=a[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
t[p]=t[p<<1]+t[p<<1|1];
}
void pushdown(int p){
if(t[p].fz!=M||t[p].lazy!=0ll){
t[p<<1].color(t[p].lazy,t[p].fz);
t[p<<1|1].color(t[p].lazy,t[p].fz);
t[p].lazy=0ll,t[p].fz=M;
}
}
void updata(int p,int l,int r,int v){
if(t[p].l>r||t[p].r<l) return;
if(t[p].l>=l&&t[p].r<=r){
t[p].color(v,M);
return;
}
pushdown(p);
updata(p<<1,l,r,v);
updata(p<<1|1,l,r,v);
t[p]=t[p<<1]+t[p<<1|1];
}
void updata2(int p,int l,int r,int v){ //区间内每个数与v 比较谁更小,然后赋值
if(t[p].l>r||t[p].r<l||t[p].maxx<=v) return;
if(t[p].l>=l&&t[p].r<=r&&t[p].minn>=v){
t[p].color(0,v);
return;
}
if(t[p].l==t[p].r) return;
pushdown(p);
updata2(p<<1,l,r,v);
updata2(p<<1|1,l,r,v);
t[p]=t[p<<1]+t[p<<1|1];
}
int Gans1(int p,int l,int r){//区间和
if(t[p].l>r||t[p].r<l) return 0ll;
if(t[p].l>=l&&t[p].r<=r) return t[p].sum;
pushdown(p);
return Gans1(p<<1,l,r)+Gans1(p<<1|1,l,r);
}
int Gans4(int p,int l,int r){//最大值
if(t[p].l>r||t[p].r<l) return -MAX;
if(t[p].l>=l&&t[p].r<=r) return t[p].maxx;
pushdown(p);
return max(Gans4(p<<1,l,r),Gans4(p<<1|1,l,r));
}
int Gans5(int p,int l,int r){//历史最大值
if(t[p].l>r||t[p].r<l) return -MAX;
if(t[p].l>=l&&t[p].r<=r) return t[p].oldm;
pushdown(p);
return max(Gans5(p<<1,l,r),Gans5(p<<1|1,l,r));
}
int opt,l,r,v;
signed main(){
n=read();m=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,1,n);
for(int i=1;i<=m;i++){
opt=read();l=read();
if(opt==1){
r=read();v=read();
updata(1,l,r,v);
}
if(opt==2){
r=read();v=read();
updata2(1,l,r,v);
}
if(opt==3){
r=read();
printf("%lld\n",Gans1(1,l,r));
}
if(opt==4){
r=read();
printf("%lld\n",Gans4(1,l,r));
}
if(opt==5){
r=read();
printf("%lld\n",Gans5(1,l,r));
}
}
return 0;
}