Guanrenhan @ 2024-07-30 19:22:18
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,m,a[1000001],t1[4000001];
struct Tree{
long long l,r,num,tag1,tag2;
}t[4000001];
void pushdown(long long i)
{
if(t1[i]==1)
{
t[i*2].tag2=0;
t[i*2].tag1=t[i].tag1;
t[i*2].num=t[i].tag1;
t1[i*2]=1;
t[i*2+1].tag2=0;
t[i*2+1].tag1=t[i].tag1;
t[i*2+1].num=t[i].tag1;
t1[i*2+1]=1;
t1[i]=0;
t[i].tag1=0;
}
else
{
t[i*2].tag2+=t[i].tag2;
t[i*2+1].tag2+=t[i].tag2;
t[i*2].num+=t[i].tag2;
t[i*2+1].num+=t[i].tag2;
t[i].tag2=0;
}
return ;
}
void pushup(long long i)
{
t[i].num=max(t[i*2].num,t[i*2+1].num);
return ;
}
void build(long long i,long long l,long long r)
{
t[i].l=l;
t[i].r=r;
if(l==r)
{
t[i].num=a[l];
return ;
}
long long mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
pushup(i);
}
void update_1(long long i,long long l,long long r,long long num)
{
if(l<=t[i].l&&t[i].r<=r)
{
t1[i]=1;
t[i].num=t[i].tag1=num;
return ;
}
pushdown(i);
long long mid=(t[i].l+t[i].r)/2;
if(l<=mid)
update_1(i*2,l,r,num);
if(r>mid)
update_1(i*2+1,l,r,num);
pushup(i);
return ;
}
void update_2(long long i,long long l,long long r,long long num)
{
if(l<=t[i].l&&t[i].r<=r)
{
t[i].num+=num;
t[i].tag2+=num;
return ;
}
pushdown(i);
long long mid=(t[i].l+t[i].r)/2;
if(l<=mid)
update_2(i*2,l,r,num);
if(r>mid)
update_2(i*2+1,l,r,num);
pushup(i);
}
long long query(long long i,long long l,long long r)
{
if(l<=t[i].l&&t[i].r<=r)
return t[i].num;
pushdown(i);
long long mid=(t[i].l+t[i].r)/2,sum=-999999999999;
if(l<=mid)
sum=max(sum,query(i*2,l,r));
if(r>mid)
sum=max(sum,query(i*2+1,l,r));
return sum;
}
int main()
{
cin>>n>>m;
for(long long i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(long long i=1,k,l,r,x;i<=m;i++)
{
cin>>k>>l>>r;
if(k==1)
{
cin>>x;
update_1(1,l,r,x);
}
if(k==2)
{
cin>>x;
update_2(1,l,r,x);
}
if(k==3)
cout<<query(1,l,r)<<endl;
}
return 0;
}```