代码在下,谢谢佬,一定关
#include<bits/stdc++.h>
using namespace std;
//main就是修改和相加会冲突,那就在下推相加前下推修改即可
long long maxx[1000006*4],add[1000006*4],cover[1000006*4];
int qes[100006];
int a[1000006];
#define ls rt*2
#define rs rt*2+1
#define inf -9187201950435737472
void pushup(int rt)
{
maxx[rt]=max(maxx[ls],maxx[rs]);
}
void build(int rt,int l,int r)
{
if(l==r)
{
maxx[rt]=a[l];
return ;
}
int mid=(l+r)/2;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(rt);
}
void coverdown(int rt)
{
if(cover[rt]!=inf)
{
cover[ls]=cover[rt];
maxx[ls]=cover[rt];
add[ls]=0;
cover[rs]=cover[rt];
maxx[rs]=cover[rt];
add[rs]=0;
cover[rt]=inf;//还原
}
}
void adddown(int rt)
{
if(add[rt]!=0)
{
coverdown(rt);
add[ls]+=add[rt];
maxx[ls]+=add[rt];
add[rs]+=add[rt];
maxx[rs]+=add[rt];
add[rt]=0;
}
}
void pushdown(int rt)
{
coverdown(rt);//先改后加
adddown(rt);
}
void change(int rt,int l,int r,int ql,int qr,int k)
{
if(ql<=l&&r<=qr)
{
cover[rt]=k;
maxx[rt]=k;
add[rt]=0;//直接不操作
return ;
}
int mid=(l+r)/2;
pushdown(rt);
if(ql<=mid)
change(ls,l,mid,ql,qr,k);
if(qr>mid)
change(rs,mid+1,r,ql,qr,k);
pushup(rt);
}
void addc(int rt,int l,int r,int ql,int qr,int k)
{
if(ql<=l&&r<=qr)
{
coverdown(rt);
maxx[rt]+=k;
add[rt]+=k;//直接不操作
return ;
}
int mid=(l+r)/2;
pushdown(rt);
if(ql<=mid)
addc(ls,l,mid,ql,qr,k);
if(qr>mid)
addc(rs,mid+1,r,ql,qr,k);
pushup(rt);
}
long long query(int rt,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
return maxx[rt];
int mid=(l+r)/2;
pushdown(rt);
long long res=inf;
if(ql<=mid)
res=max(res,query(ls,l,mid,ql,qr));
if(qr>mid)
res=max(res,query(rs,mid+1,r,ql,qr));
return res;
}
int main()
{
memset(maxx,128,sizeof(maxx));
//cout<<maxx[1]<<endl;
int n,q,op,a1,b1,x;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
for(int j=1;j<=4;j++)
{
cover[i*j]=inf;//特殊的标记
}
}
build(1,1,n);
int cnt=0;
//cout<<' '<<maxx[1]<<endl;
for(int i=1;i<=q;i++)
{
cin>>op>>a1>>b1;
if(op==1)//修改为!
{
cin>>x;
change(1,1,n,a1,b1,x);
}
else if(op==2)//加
{
cin>>x;
addc(1,1,n,a1,b1,x);
}
else if(op==3)//求最大
{
qes[++cnt]=query(1,1,n,a1,b1);
//cout<<query(1,1,n,a1,b1)<<endl;
}
}
for(int i=1;i<=cnt;i++)
{
cout<<qes[i]<<endl;
}
return 0;
}