本人蒟蒻
不知为何,本题WA 20%
本人代码如下:
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long a[1000005],maxn[4000005],add[4000005][2];
void pushup(long long rt)
{
maxn[rt]=max(maxn[rt<<1],maxn[rt<<1|1]);
}
void pushdown(long long rt,long long len)
{
if(add[rt][0])
{
maxn[rt<<1]=maxn[rt<<1|1]=add[rt][0],
add[rt<<1][0]=add[rt<<1|1][0]=add[rt][0];
add[rt][0]=0;
}
if(add[rt][1])
{
maxn[rt<<1]+=add[rt][1],maxn[rt<<1|1]+=add[rt][1],
add[rt<<1][1]=add[rt<<1|1][1]=add[rt][1];
add[rt][1]=0;
}
}
void build(long long l,long long r,long long rt)
{
if(l==r)
{
maxn[rt]=a[l];
return ;
}
long long mid=l+r>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void update1(long long ul,long long ur,long long nv,long long l,long long r,long long rt)
{
if(ul<=l&&ur>=r)
{
if(l!=r)
pushdown(rt,r-l+1);
maxn[rt]=nv,add[rt][0]=nv;
return ;
}
long long mid=l+r>>1;
pushdown(rt,r-l+1);
if(ul<=mid)
update1(ul,ur,nv,l,mid,rt<<1);
if(ur>mid)
update1(ul,ur,nv,mid+1,r,rt<<1|1);
pushup(rt);
}
void update2(long long ul,long long ur,long long nv,long long l,long long r,long long rt)
{
if(ul<=l&&ur>=r)
{
if(l!=r)
pushdown(rt,r-l+1);
maxn[rt]+=nv,add[rt][1]+=nv;
return ;
}
long long mid=l+r>>1;
pushdown(rt,r-l+1);
if(ul<=mid)
update2(ul,ur,nv,l,mid,rt<<1);
if(ur>mid)
update2(ul,ur,nv,mid+1,r,rt<<1|1);
pushup(rt);
}
long long query(long long ql,long long qr,long long l,long long r,long long rt)
{
if(ql<=l&&qr>=r)
return maxn[rt];
long long mid=l+r>>1,cnt=LLONG_MIN;
pushdown(rt,r-l+1);
if(ql<=mid)
cnt=max(query(ql,qr,l,mid,rt<<1),cnt);
if(qr>mid)
cnt=max(query(ql,qr,mid+1,r,rt<<1|1),cnt);
return cnt;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,n,1);
for(long long i=1;i<=m;i++)
{
long long op,x,y,z;
cin>>op>>x>>y;
switch(op)
{
case 1:scanf("%lld",&z);update1(x,y,z,1,n,1);break;
case 2:scanf("%lld",&z);update2(x,y,z,1,n,1);break;
case 3:printf("%lld\n",query(x,y,1,n,1));
}
}
return 0;
}
望相助!