麻烦大佬指正qwq
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000005;
int n,q;
int a[N],ans[N<<2],tag[N<<2],ctag[N<<2];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void up(int p){ans[p]=max(ans[ls(p)],ans[rs(p)]);}
inline void build(int p,int l,int r)
{
tag[p]=0;
ctag[p]=-1234567890;
if(l==r)
{
ans[p]=a[l];
return;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
up(p);
}
inline void down(int p,int l,int r)
{
int mid=(l+r)>>1;
if(!tag[p])
{
ans[ls(p)]+=tag[p]*(mid-l+1);
ans[rs(p)]+=tag[p]*(r-mid);
tag[ls(p)]+=tag[p];
tag[rs(p)]+=tag[p];
tag[p]=0;
}
if(ctag[p]!=-1234567890)
{
int mid=(l+r)>>1;
ans[ls(p)]=ctag[p]*(mid-l+1);
ans[rs(p)]=ctag[p]*(r-mid);
ctag[ls(p)]=ctag[p];
ctag[rs(p)]=ctag[p];
ctag[p]=-1234567890;
}
}
inline void add(int l,int r,int p,int x,int y,int k)
{
if(x<=l&&y>=r)
{
ans[p]+=k*(r-l+1);
tag[p]+=k;
return;
}
down(p,l,r);
int mid=(l+r)>>1;
if(x<=mid)add(l,mid,ls(p),x,y,k);
if(y>mid)add(mid+1,r,rs(p),x,y,k);
up(p);
}
inline void change(int l,int r,int p,int x,int y,int k)
{
if(x<=l&&y>=r)
{
tag[p]=0;
ans[p]=ctag[p]=k;
return;
}
down(p,l,r);
int mid=(l+r)>>1;
if(x<=mid)change(l,mid,ls(p),x,y,k);
if(y>mid)change(mid+1,r,rs(p),x,y,k);
up(p);
}
inline int ask(int l,int r,int p,int x,int y)
{
if(x<=l&&y>=r)return ans[p];
int mid=(l+r)>>1;
int c,d;
c=d=-1e9;
if(x<=mid)c=ask(l,mid,ls(p),x,y);
if(y>mid)d=ask(mid+1,r,rs(p),x,y);
return max(c,d);
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(q--)
{
int op,l,r,x;
cin>>op>>l>>r;
if(op==1)
{
cin>>x;
change(1,n,1,l,r,x);
}
if(op==2)
{
cin>>x;
add(1,n,1,l,r,x);
}
if(op==3)cout<<ask(1,n,1,l,r)<<'\n';
}
return 0;
}