Blue_Flower @ 2023-02-25 19:53:20
#include<bits/stdc++.h>
#define MAXN 1000010
#define ll long long
using namespace std;
ll n,q,w[MAXN*4],lzya[MAXN*4],lzy[MAXN*4],inf;
ll _max(ll a,ll b)
{
return a>b ? a:b;
}
void build(ll u,ll l,ll r)
{
if(l==r)
{
scanf("%lld",&w[u]);return;
}
ll mid=(l+r)/2;
build(u*2,l,mid);build(u*2+1,mid+1,r);
w[u]=_max(w[u*2],w[u*2+1]);
return;
}
void pushdown(ll u)
{
if(lzy[u]!=inf)
{
w[u]=lzy[u];
lzya[u*2]=lzya[u*2+1]=0;
lzy[u*2]=lzy[u*2+1]=lzy[u];
}
lzy[u]=inf;
w[u]+=lzya[u];
lzya[u*2]+=lzya[u];lzya[u*2+1]+=lzya[u];
lzya[u]=0;
return;
}
inline bool in(ll l1,ll r1,ll l2,ll r2)
{
return l1>=l2&&r1<=r2;
}
inline bool out(ll l1,ll r1,ll l2,ll r2)
{
return r1<l2||l1>r2;
}
void change(ll u,ll l,ll r,ll x,ll y,ll k)
{
pushdown(u);
if(in(l,r,x,y))
{
lzy[u]=k;pushdown(u);
return;
}
if(!out(l,r,x,y))
{
int mid=(l+r)/2;
change(u*2,l,mid,x,y,k);change(u*2+1,mid+1,r,x,y,k);
w[u]=_max(w[u*2],w[u*2+1]);
}
return;
}
void add(ll u,ll l,ll r,ll x,ll y,ll k)
{
pushdown(u);
if(in(l,r,x,y))
{
lzya[u]=k;pushdown(u);
return;
}
if(!out(l,r,x,y))
{
int mid=(l+r)/2;
add(u*2,l,mid,x,y,k);add(u*2+1,mid+1,r,x,y,k);
w[u]=_max(w[u*2],w[u*2+1]);
}
return;
}
ll find(ll u,ll l,ll r,ll x,ll y)
{
pushdown(u);
if(in(l,r,x,y)) return w[u];
if(!out(l,r,x,y))
{
int mid=(l+r)/2;
if(out(l,mid,x,y)) return find(u*2+1,mid+1,r,x,y);
else if(out(mid+1,r,x,y)) return find(u*2,l,mid,x,y);
else return _max(find(u*2,l,mid,x,y),find(u*2+1,mid+1,r,x,y));
}
}
int main()
{
memset(lzy,0x3f3f3f,sizeof(lzy));inf=lzy[0];
scanf("%d%d",&n,&q);
build(1,1,n);
ll op,l,r,x;
while(q--)
{
scanf("%d%d%d",&op,&l,&r);
switch(op)
{
case 1: scanf("%lld",&x);change(1,1,n,l,r,x);break;
case 2: scanf("%lld",&x);add(1,1,n,l,r,x);break;
default: printf("%lld\n",find(1,1,n,l,r));
}
}
return 0;
}
by Blue_Flower @ 2023-02-25 19:55:11
想了很多,后来给int全改long long,还是没过,以为会不会max爆炸了,还手写了一个