YPPAH @ 2023-10-12 14:39:33
#include<bits/stdc++.h>
#define lo (nw<<1)
#define ro (nw<<1|1)
#define md ((l+r)>>1)
using namespace std;
const int N=1000010,INF=0x3f3f3f3f;
int n,q;
int a[N];
struct node
{
int sm,sz;
int ch,pl;
int mx;
}t[5*N];
struct segment_tree
{
void upd(int nw)
{
t[nw].sm=t[lo].sm+t[ro].sm;
t[nw].sz=t[lo].sz+t[ro].sz;
t[nw].mx=max(t[lo].mx,t[ro].mx);
return ;
}
void mkpl(int nw,int z)
{
t[nw].pl=t[nw].pl+z;
t[nw].sm=t[nw].sm+t[nw].sz*z;
t[nw].mx=t[nw].mx+z;
return ;
}
void mkch(int nw,int z)
{
t[nw].ch=z;
t[nw].sm=t[nw].sz*z;
t[nw].pl=0;
t[nw].mx=z;
return ;
}
void psd(int nw)
{
if(t[nw].ch!=INF)
{
mkch(lo,t[nw].ch);
mkch(ro,t[nw].ch);
t[nw].ch=INF;
}
if(t[nw].pl!=0)
{
mkpl(lo,t[nw].pl);
mkpl(ro,t[nw].pl);
t[nw].pl=0;
}
return ;
}
void bld(int nw,int l,int r)
{
t[nw].pl=0;
t[nw].ch=INF;
if(l==r)
{
t[nw].sm=a[l];
t[nw].sz=1;
t[nw].mx=a[l];
return ;
}
bld(lo,l,md);
bld(ro,md+1,r);
upd(nw);
return ;
}
void atp(int nw,int l,int r,int x,int y,int z)
{
if(x<=l&&r<=y)
{
mkpl(nw,z);
return ;
}
psd(nw);
if(x<=md)
atp(lo,l,md,x,y,z);
if(y>md)
atp(ro,md+1,r,x,y,z);
upd(nw);
return ;
}
void atc(int nw,int l,int r,int x,int y,int z)
{
if(x<=l&&r<=y)
{
mkch(nw,z);
return ;
}
psd(nw);
if(x<=md)
atc(lo,l,md,x,y,z);
if(y>md)
atc(ro,md+1,r,x,y,z);
upd(nw);
return ;
}
int qry(int nw,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return t[nw].mx;
}
psd(nw);
int maxx=-INF;
if(x<=md)
maxx=max(maxx,qry(lo,l,md,x,y));
if(y>md)
maxx=max(maxx,qry(ro,md+1,r,x,y));
return maxx;
}
}ST;
signed main()
{
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
ST.bld(1,1,n);
for(int i=1;i<=q;i++)
{
int op,l,r,x;
cin>>op;
if(op==1)
{
cin>>l>>r>>x;
ST.atc(1,1,n,l,r,x);
}
if(op==2)
{
cin>>l>>r>>x;
ST.atp(1,1,n,l,r,x);
}
if(op==3)
{
cin>>l>>r;
cout<<ST.qry(1,1,n,l,r)<<"\n";
}
}
return 0;
}
by YPPAH @ 2023-10-12 16:43:29
此贴已结,只是INF没开到longlong还没用scanf
by XCDRF @ 2023-10-12 16:59:49
@YPPAH ???
这错你让我调?