最后4个点WA了
#include<cstdio>
#define LL long long
LL read(){
LL x=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c<='9'&&c>='0'){x=((x<<3)+(x<<1)+(c^48));c=getchar();}
return x*f;
}
void read(LL&x){
x=0;
LL f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c<='9'&&c>='0'){x=((x<<3)+(x<<1)+(c^48));c=getchar();}
x=x*f;
}
void write(LL x){
char ch[20];
LL len=0;
if(x<0){
putchar('-');
x=~x+1;
}
do{
ch[len++]=x%10+48;
x/=10;
}while(x>0);
LL i;
for(i=len-1;i>=0;i--)
putchar(ch[i]);
return;
}
LL max(LL x,LL y){
return x>y?x:y;
}
LL a[1000001],nl,nr;
LL x;
struct SGT{
LL mx=0x8000000000000000,w,add;
bool b;
}sgt[4000004];
void build(LL rt,LL l,LL r);
void pushdown(LL rt,LL l,LL r);
void uw(LL rt,LL l,LL r);
void uadd(LL rt,LL l,LL r);
LL ask(LL rt,LL l,LL r);
signed main(){
// freopen("P1253.in","r",stdin);
// freopen("P1253.out","w",stdout);
LL n,q,op;
read(n);
read(q);
for(LL i=1;i<=n;i++)
read(a[i]);
build(1,1,n);
while(q--){
read(op);
switch(op){
case 1:
read(nl);
read(nr);
read(x);
uw(1,1,n);
break;
case 2:
read(nl);
read(nr);
read(x);
uadd(1,1,n);
break;
case 3:
read(nl);
read(nr);
write(ask(1,1,n));
putchar('\n');
break;
}
}
}
void build(LL rt,LL l,LL r){
if(l==r)
sgt[rt].mx=a[l];
else{
LL m=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
build(ls,l,m);
build(rs,m+1,r);
sgt[rt].mx=max(sgt[ls].mx,sgt[rs].mx);
}
}
void pushdown(LL rt){
LL ls=rt<<1,rs=rt<<1|1;
if(sgt[rt].b){
sgt[ls].mx=sgt[ls].w=sgt[rt].w;
sgt[rs].mx=sgt[rs].w=sgt[rt].w;
sgt[rt].b=0;
sgt[ls].add=sgt[rs].add=0;
}
sgt[ls].add+=sgt[rt].add;
sgt[rs].add+=sgt[rt].add;
sgt[ls].mx+=sgt[rt].add;
sgt[rs].mx+=sgt[rt].add;
sgt[rt].add=0;
}
void uadd(LL rt,LL l,LL r){
if(l>=nl&&r<=nr){
sgt[rt].add+=x;
sgt[rt].mx+=x;
}
else{
pushdown(rt);
LL m=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
if(nl<=m)
uadd(ls,l,m);
if(nr>m)
uadd(rs,m+1,r);
sgt[rt].mx=max(sgt[ls].mx,sgt[rs].mx);
}
}
void uw(LL rt,LL l,LL r){
if(l>=nl&&r<=nr){
sgt[rt].add=0;
sgt[rt].mx=sgt[rt].w=x;
sgt[rt].b=true;
}
else{
pushdown(rt);
LL m=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
if(nl<=m)
uw(ls,l,m);
if(nr>m)
uw(rs,m+1,r);
sgt[rt].mx=max(sgt[ls].mx,sgt[rs].mx);
}
}
LL ask(LL rt,LL l,LL r){
if(l>=nl&&r<=nr)
return sgt[rt].mx;
else{
LL ans(0x8000000000000000);
pushdown(rt);
LL m=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
if(nl<=m)
ans=max(ans,ask(ls,l,m));
if(nr>m)
ans=max(ans,ask(rs,m+1,r));
return ans;
}
}