bearbearma @ 2022-05-03 21:09:09
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6+7;
struct CNM{
ll add=0;
ll become=1e10;
};
ll Tree[N*4],a[N];
CNM tag[N*4];
void add1(int id,int l,int r,ll val){
tag[id].become=val;
tag[id].add=0;
Tree[id]=val;
}
void add2(int id,int l,int r,ll val){
tag[id].add+=val;
Tree[id]+=val;
}
void push_down(int id,int l,int r){
if(tag[id].become!=1e10){
int mid=(l+r)>>1;
add1(id*2,l,mid,tag[id].become);
add1(id*2+1,mid+1,r,tag[id].become);
tag[id].become=1e10;
}
if(tag[id].add!=0){
int mid=(l+r)>>1;
add2(id*2,l,mid,tag[id].add);
add2(id*2+1,mid+1,r,tag[id].add);
tag[id].add=0;
}
}
void build_tree(int id,int l,int r){
if(l==r){
Tree[id]=a[l];return;
}
int mid=(l+r)>>1;
build_tree(id*2,l,mid);
build_tree(id*2+1,mid+1,r);
Tree[id]=max(Tree[id*2],Tree[id*2+1]);
}
void ud1(int id,int l,int r,int L,int R,ll val){
if(l==L&&r==R){
tag[id].add=0;
tag[id].become=val;
Tree[id]=val;
return;
}
int mid=(l+r)>>1;push_down(id,l,r);
if(R<=mid)ud1(id*2,l,mid,L,R,val);
else if(L>mid)ud1(id*2+1,mid+1,r,L,R,val);
else{
ud1(id*2,l,mid,L,mid,val);
ud1(id*2+1,mid+1,r,mid+1,R,val);
}
Tree[id]=max(Tree[id*2],Tree[id*2+1]);
}
void ud2(int id,int l,int r,int L,int R,ll val){
if(l==L&&r==R){
tag[id].add+=val;
Tree[id]+=val;
return;
}
int mid=(l+r)>>1;push_down(id,l,r);
if(R<=mid)ud2(id*2,l,mid,L,R,val);
else if(L>mid)ud2(id*2+1,mid+1,r,L,R,val);
else{
ud2(id*2,l,mid,L,mid,val);
ud2(id*2+1,mid+1,r,mid+1,R,val);
}
Tree[id]=max(Tree[id*2],Tree[id*2+1]);
}
ll query(int id,int l,int r,int L,int R){
if(l==L&&r==R)return Tree[id];
int mid=(l+r)>>1;push_down(id,l,r);
if(R<=mid)return query(id*2,l,mid,L,R);
else if(L>mid)return query(id*2+1,mid+1,r,L,R);
else return max(query(id*2,l,mid,L,mid),query(id*2+1,mid+1,r,mid+1,R));
Tree[id]=max(Tree[id*2],Tree[id*2+1]);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
int n,m;cin>>n>>m;
for(int i=1;i<=n;++i)cin>>a[i];
build_tree(1,1,n);
for(int i=1;i<=m;++i){
int op;cin>>op;
if(op==1){
int l,r,x;cin>>l>>r>>x;
ud1(1,1,n,l,r,x);
}
else if(op==2){
ll l,r,x;cin>>l>>r>>x;
ud2(1,1,n,l,r,x);
}
else{
ll l,r;cin>>l>>r;
cout<<query(1,1,n,l,r)<<'\n';
}
}
return 0;
}
by Eric998 @ 2022-05-03 21:15:30
1e6默认为double