Anonymely @ 2022-07-03 09:06:07
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=200005;
const int inf=1e18;
int n,m;
int a[N];
struct tree{
int l,r;
int sum;
int tag1=inf,tag2;
}t[N<<2];
int lson(int p){return p<<1;}
int rson(int p){return (p<<1)|1;}
int md(int l,int r){return (l+r)>>1;}
void pushup(int p){
t[p].sum=max(t[lson(p)].sum,t[rson(p)].sum);
}
void make_tag1(int p,int k){
t[p].sum=k;
t[p].tag1=k;
t[p].tag2=0;
}
void make_tag2(int p,int k){
t[p].sum+=k;
if(t[p].tag1!=inf)t[p].tag1+=k;
else t[p].tag2+=k;
}
void pushdown(int p){
if(t[p].tag1!=inf){
make_tag1(lson(p),t[p].tag1);
make_tag1(rson(p),t[p].tag1);
t[p].tag1=inf;
}else if(t[p].tag2){
make_tag2(lson(p),t[p].tag2);
make_tag2(rson(p),t[p].tag2);
t[p].tag2=0;
}
}
void build(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].sum=a[l];return ;
}
int mid=md(l,r);
build(lson(p),l,mid);
build(rson(p),mid+1,r);
pushup(p);
}
void update(int p,int l,int r,int op,int k){
if(l<=t[p].l&&t[p].r<=r){
if(op==1)make_tag1(p,k);
else make_tag2(p,k);
return ;
}
int mid=md(t[p].l,t[p].r);
pushdown(p);
if(l<=mid)update(lson(p),l,r,op,k);
if(r>mid)update(rson(p),l,r,op,k);
pushup(p);
}
int query(int p,int l,int r){
if(l<=t[p].l&&t[p].r<=r){
return t[p].sum;
}
pushdown(p);
int ans=-inf;
int mid=md(t[p].l,t[p].r);
if(l<=mid)ans=max(ans,query(lson(p),l,r));
if(r>mid)ans=max(ans,query(rson(p),l,r));
return ans;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int op,l,r;cin>>op>>l>>r;
if(op==1){
int x;cin>>x;
update(1,l,r,x,1);
}else if(op==2){
int x;cin>>x;
update(1,l,r,x,2);
}else{
cout<<query(1,l,r)<<endl;
}
}
return 0;
}
麻了,没过样例