Xuwindows_WS @ 2024-07-15 21:15:04
#include<bits/stdc++.h>
using namespace std;
long long a[1000010];
long long tr[4000040];
long long lza[4000040];
long long lzu[4000040];
bool vis[4000040];
void build(long long l,long long r,long long id)
{
if(l==r)
{
tr[id]=a[l];
return;
}
int mid=(l+r)/2;
build(l,mid,id*2);
build(mid+1,r,id*2+1);
tr[id]=max(tr[id*2],tr[id*2+1]);
}
void add(long long lu,long long ru,long long ln,long long rn,long long id,long long k)
{
if(lu<=ln&&ru>=rn)
{
tr[id]+=k;
lza[id]+=k;
return;
}
long long mid=(ln+rn)/2;
if(lza[id]!=0&&ln!=rn)
{
tr[id*2]+=lza[id];
tr[id*2+1]+=lza[id];
lza[id*2]+=lza[id];
lza[id*2+1]+=lza[id];
lza[id]=0;
}
if(lu<=mid)add(lu,ru,ln,mid,id*2,k);
if(ru>mid)add(lu,ru,mid+1,rn,id*2+1,k);
tr[id]=max(tr[id*2],tr[id*2+1]);
}
void upd(long long lu,long long ru,long long ln,long long rn,long long id,long long k)
{
// cout<<' '<<lu<<' '<<ru<<' '<<ln<<' '<<rn<<' '<<id<<' '<<k<<endl;
// cout<<tr[id]<<' '<<lzu[id]<<endl;
if(lu<=ln&&ru>=rn)
{
tr[id]=k;
lzu[id]=k;
vis[id]=false;
return;
}
long long mid=(ln+rn)/2;
if(!vis[id]&&ln!=rn)
{
tr[id*2]=lzu[id];
tr[id*2+1]=lzu[id];
lzu[id*2]=lzu[id];
lzu[id*2+1]=lzu[id];
lzu[id]=0;
vis[id]=true;
}
// cout<<tr[id]<<' '<<lzu[id]<<endl;
if(lu<=mid)upd(lu,ru,ln,mid,id*2,k);
// cout<<tr[id]<<' '<<lzu[id]<<endl;
if(ru>mid)upd(lu,ru,mid+1,rn,id*2+1,k);
// cout<<tr[id]<<' '<<lzu[id]<<endl;
tr[id]=max(tr[id*2],tr[id*2+1]);
// cout<<tr[id]<<' '<<lzu[id]<<endl;
}
long long getmax(long long lc,long long rc,long long ln,long long rn,long long id)
{
if(lc<=ln&&rc>=rn)
{
return tr[id];
}
long long mid=(ln+rn)/2;
if(lza[id]!=0)
{
tr[id*2]+=lza[id];
tr[id*2+1]+=lza[id];
lza[id*2]+=lza[id];
lza[id*2+1]+=lza[id];
lza[id]=0;
}
if(lzu[id]!=0)
{
tr[id*2]=lzu[id];
tr[id*2+1]=lzu[id];
lzu[id*2]=lzu[id];
lzu[id*2+1]=lzu[id];
lzu[id]=0;
}
long long maxn=0;
if(lc<=mid)maxn=max(getmax(lc,rc,ln,mid,id*2),maxn);
if(rc>mid)maxn=max(getmax(lc,rc,mid+1,rn,id*2+1),maxn);
return maxn;
}
int main()
{
long long n,m;
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++)
{
int op;
scanf("%lld",&op);
if(op==1)
{
long long x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
upd(x,y,1,n,1,k);
}
else if(op==2)
{
long long x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
add(x,y,1,n,1,k);
}
else if(op==3)
{
long long x,y;
scanf("%lld%lld",&x,&y);
cout<<getmax(x,y,1,n,1)<<endl;
}
}
return 0;
}
by cyberlangke @ 2024-07-16 19:58:16
会不会是getmax函数的原因, 初始maxn为0的话, 如果孩子的最大值为负数是不是会错?
by Xuwindows_WS @ 2024-07-16 20:37:47
改成了-1e16-10还是错(记录)
不过还是谢谢你。(至少多得了10pts)