Liyuqiao11 @ 2023-03-05 10:39:40
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
#define int long long
int len,id[N],n,q,a[N],maxn[N];
void fix(int l,int r,int x){
int sid=id[l],eid=id[r];
if(sid==eid){
for(int i=l;i<=r;i++){
a[i]=x;
}
maxn[sid]=-1e18;
for(int i=(sid-1)*len+1;id[i]==sid;i++){
maxn[sid]=max(maxn[sid],a[i]);
}
return;
}
for(int i=l;id[i]==sid;i++){
a[i]=x;
}
maxn[sid]=-1e18;
for(int i=(sid-1)*len+1;id[i]==sid;i++){
maxn[sid]=max(maxn[sid],a[i]);
}
for(int i=sid+1;i<eid;i++){
maxn[i]=x;
}
for(int i=r;id[i]==eid;i--){
a[i]=x;
}
maxn[eid]=-1e18;
for(int i=(eid-1)*len+1;id[i]==eid;i++){
maxn[eid]=max(maxn[eid],a[i]);
}
}
void add(int l,int r,int x){
int sid=id[l],eid=id[r];
if(sid==eid){
for(int i=l;i<=r;i++){
a[i]+=x;
}
maxn[sid]=-1e18;
for(int i=(sid-1)*len+1;id[i]==sid;i++){
maxn[sid]=max(maxn[sid],a[i]);
}
return;
}
for(int i=l;id[i]==sid;i++){
a[i]+=x;
}
maxn[sid]=-1e18;
for(int i=(sid-1)*len+1;id[i]==sid;i++){
maxn[sid]=max(maxn[sid],a[i]);
}
for(int i=sid+1;i<eid;i++){
maxn[i]+=x;
}
for(int i=r;id[i]==eid;i--){
a[i]+=x;
}
maxn[eid]=-1e18;
for(int i=(eid-1)*len+1;id[i]==eid;i++){
maxn[eid]=max(maxn[eid],a[i]);
}
}
int query(int l,int r){
int sid=id[l],eid=id[r],maxnn=-1e18;
if(sid==eid){
for(int i=l;i<=r;i++){
maxnn=max(maxnn,a[i]);
}
return maxnn;
}
for(int i=l;id[i]==sid;i++){
maxnn=max(maxnn,a[i]);
}
for(int i=sid+1;i<eid;i++){
maxnn=max(maxnn,maxn[i]);
}
for(int i=r;id[i]==eid;i--){
maxnn=max(maxnn,a[i]);
}
return maxnn;
}
signed main(){
cin>>n>>q;
len=sqrt(n);
memset(maxn,128,sizeof(maxn));
for(int i=1;i<=n;i++){
cin>>a[i];
id[i]=(i-1)/len+1;
maxn[id[i]]=max(maxn[id[i]],a[i]);
}
for(int i=1;i<=q;i++){
int op,l,r,x;
cin>>op;
if(op==1){
cin>>l>>r>>x;
fix(l,r,x);
}
if(op==2){
cin>>l>>r>>x;
add(l,r,x);
}
if(op==3){
cin>>l>>r;
cout<<query(l,r)<<endl;
}
}
return 0;
}