rt,1、3能过,其他全WA
#include<bits/stdc++.h>
#define int __int128
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(!(ch>='0'&&ch<='9'))
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>10) write(x/10);
putchar(x%10+'0');
}
struct node
{
int mx,lay,layj;
}tr[8000005];
void pu(int u)
{
tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx);
}
void pd(int u)
{
if(tr[u].lay!=-INT_MAX)
{
tr[u<<1].lay=tr[u<<1|1].lay=tr[u<<1].mx=tr[u<<1|1].mx=tr[u].lay;
tr[u<<1].layj=tr[u<<1|1].layj=0;
tr[u].lay=-INT_MAX;
tr[u].layj=0;
}
tr[u<<1].mx+=tr[u].layj;
tr[u<<1].layj+=tr[u].layj;
tr[u<<1|1].mx+=tr[u].layj;
tr[u<<1|1].layj+=tr[u].layj;
tr[u].layj=0;
}
void build(int l,int r,int u)
{
if(l==r)
{
tr[u].mx=read();
tr[u].lay=-INT_MAX;
return;
}
tr[u].mx=-INT_MAX;
tr[u].lay=-INT_MAX;
int mid=l+r>>1;
build(l,mid,u<<1);
build(mid+1,r,u<<1|1);
pu(u);
}
void upd(int L,int R,int l,int r,int u,int x,int opt)
{
if(L<=l&&r<=R)
{
if(opt==1)
{
tr[u].mx=x;
tr[u].lay=x;
tr[u].layj=0;
}
if(opt==2)
{
tr[u].mx+=x;
if(tr[u].lay==-INT_MAX) tr[u].layj+=x;
else tr[u].lay+=x;
}
return;
}
pd(u);
int mid=l+r>>1;
if(L<=mid) upd(L,R,l,mid,u<<1,x,opt);
if(R>mid) upd(L,R,mid+1,r,u<<1|1,x,opt);
pu(u);
}
int query(int L,int R,int l,int r,int u)
{
if(L<=l&&r<=R) return tr[u].mx;
pd(u);
int mid=l+r>>1,ans=-INT_MAX;
if(L<=mid) ans=max(ans,query(L,R,l,mid,u<<1));
if(R>mid) ans=max(ans,query(L,R,mid+1,r,u<<1|1));
return ans;
}
signed main()
{
freopen("P1253_2.in","r",stdin);
freopen("P1253.out","w",stdout);
int n=read(),q=read();
build(1,n,1);
while(q--)
{
int opt=read(),l=read(),r=read();
if(opt!=3) upd(l,r,1,n,1,read(),opt);
else
{
write(query(l,r,1,n,1));
putchar('\n');
}
}
return 0;
}