b1468821672 @ 2022-11-24 16:08:06
#include<iostream>
using namespace std;
const int MAXN=1e6+10;
const int INF=1e10+10;
int n,m;
int a[MAXN];
struct tree
{
int l,r;
long long add;
long long maxn,v;
}t[MAXN<<4];
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void build(int i,int l,int r)
{
t[i].l=l,t[i].r=r;
t[i].v=INF;
if(l==r)
{
t[i].maxn=a[l];
return;
}
int mid=l+r>>1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
inline void push_down(int i)
{
if(t[i].v!=INF)
{
t[i*2].maxn=t[i].v+t[i].add;
t[i*2+1].maxn=t[i].v+t[i].add;
t[i*2].v=t[i].v;
t[i*2+1].v=t[i].v;
t[i*2].add=t[i].add;
t[i*2+1].add=t[i].add;
t[i].add=0;
t[i].v=INF;
}
if(t[i].add)
{
t[i*2].maxn+=t[i].add;
t[i*2+1].maxn+=t[i].add;
t[i*2].add+=t[i].add;
t[i*2+1].add+=t[i].add;
t[i].add=0;
}
}
inline void add(int i,int l,int r,long long w)
{
if(t[i].l>=l&&t[i].r<=r)
{
t[i].add+=w;
t[i].maxn+=w;
return;
}
push_down(i);
int mid=t[i].l+t[i].r>>1;
if(l<=mid)add(i*2,l,r,w);
if(r>mid)add(i*2+1,l,r,w);
t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
inline void change(int i,int l,int r,long long w)
{
if(t[i].l>=l&&t[i].r<=r)
{
t[i].v=w;
t[i].add=0;
t[i].maxn=w;
return;
}
push_down(i);
int mid=t[i].l+t[i].r>>1;
if(l<=mid)change(i*2,l,r,w);
if(r>mid)change(i*2+1,l,r,w);
t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
inline long long query(int i,int l,int r)
{
if(t[i].l>=l&&t[i].r<=r)return t[i].maxn;
push_down(i);
int mid=t[i].l+t[i].r>>1;
long long ans=0;
if(l<=mid)ans=query(i*2,l,r);
if(r>mid)ans=max(query(i*2+1,l,r),ans);
// t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
return ans;
}
signed main()
{
n=read(),m=read();
for(int i=1;i<=n;++i)cin>>a[i];
build(1,1,n);
// cout<<query(1,1,n);
for(int i=1;i<=m;i++)
{
int op=read(),l=read(),r=read(),x=0;
if(op==1)
{
x=read();
change(1,l,r,x);
}
if(op==2)
{
x=read();
add(1,l,r,x);
}
if(op==3)
{
cout<<query(1,l,r)<<endl;
}
}
}
by 02Ljh @ 2022-12-01 19:14:55
@b1468821672 INF不够大 建议0x3f3f3f3f 然后你就能获得60pts的好成绩了
by Z_X_D_ @ 2022-12-02 22:00:17
97行ans可能为负数,所以应该赋值为-INF
ww
by Z_X_D_ @ 2022-12-02 22:01:33
还有INF不够大