求条,给关
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct Tree{
int l,r,sum,lz1,lz2,flg;
}tr[4000005];
void build(int p,int l,int r){
tr[p].l=l;tr[p].r=r;tr[p].sum=0;
if(l==r) return;
int mid=(l+r)>>1;
build(p<<1,l,mid);build((p<<1)+1,mid+1,r);
}
void uplz(int p,int lz1,int lz2,int flg){
if(flg==1){
tr[p].sum=lz1;
tr[p].lz2=lz2;
tr[p].lz1=0;
tr[p].flg=flg;
}
tr[p].sum+=lz1;
tr[p].lz1+=lz1;
}
void pushdown(int p){
if(tr[p].lz1!=0||tr[p].flg!=0){
uplz(p<<1,tr[p].lz1,tr[p].lz2,tr[p].flg);
uplz((p<<1)+1,tr[p].lz1,tr[p].lz2,tr[p].flg);
tr[p].lz1=tr[p].lz2=tr[p].flg=0;
}
}
void modify(int p,int l,int r,int b){
if(tr[p].l>r||tr[p].r<l) return;
if(tr[p].l>=l&&tr[p].r<=r){
uplz(p,tr[p].l,tr[p].r,b);
return;
}
pushdown(p);
modify(p<<1,l,r,b);
modify((p<<1)+1,l,r,b);
tr[p].sum=max(tr[p<<1].sum,tr[(p<<1)+1].sum);
}
void modify2(int p,int a,int b,int x){
if(tr[p].l>a||tr[p].r<b) return;
if(tr[p].l>=a&&tr[p].r<=b){
tr[p].sum=x;return;
}
modify2(p<<1,a,b,x);
modify2((p<<1)+1,a,b,x);
tr[p].sum=max(tr[p<<1].sum,tr[(p<<1)+1].sum);
}
int query(int p,int a,int b){
if(tr[p].l>b||tr[p].r<a) return 0;
if(tr[p].l>=a&&tr[p].r<=b) return tr[p].sum;
int sum=0;
pushdown(p);
sum=max(sum,query(p<<1,a,b));
sum=max(sum,query((p<<1)+1,a,b));
return sum;
}
signed main(){
int n,m;cin>>n>>m;
build(1,1,n);
for(int i=1;i<=n;i++){
int a;cin>>a;
modify2(1,i,i,a);
cout<<"MAX="<<query(1,1,i)<<' ';
}
cout<<'\n';
while(m--){
int opt,x,y,k;cin>>opt;
if(opt==1){
cin>>x>>y>>k;
modify(1,x,y,k);
cout<<"MAX="<<query(1,1,n)<<'\n';
}
if(opt==2){
cin>>x>>y>>k;
modify(1,x,y,k);
cout<<"MAX="<<query(1,1,n)<<'\n';
}
if(opt==3){
cin>>x>>y;
cout<<query(1,x,y)<<'\n';
}
}
return 0;
}