rt,玄一关
AC on #1,3
WA on #2&4-9
RE on #10
#include <iostream>
using namespace std;
typedef long long ll;
const int N=1e6+5;
const ll no_cover=1e9+5;
struct node{
int l,r;
ll maxn,add_tag,cover_tag;
} tr[N<<2];
int n,q;
ll a[N];
inline void push_up(int u){
tr[u].maxn=max(tr[u<<1].maxn,tr[(u<<1)+1].maxn);
}
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r;
if (l==r){
tr[u].maxn=a[l];
return;
}
int mid=(l+r)/2;
build(u<<1,l,mid);
build((u<<1)+1,mid+1,r);
push_up(u);
}
inline void push_cover(int u){
if (tr[u].cover_tag!=no_cover){
int ls=u<<1,rs=(u<<1)+1;
tr[ls].cover_tag=tr[rs].cover_tag=tr[u].cover_tag;
tr[ls].maxn=tr[rs].maxn=tr[u].cover_tag;
tr[u].cover_tag=no_cover;
tr[ls].add_tag=tr[rs].add_tag=0;
}
}
inline void push_add(int u){
if (tr[u].add_tag){
push_cover(u);
int ls=u<<1,rs=(u<<1)+1;
tr[ls].maxn+=tr[u].add_tag;
tr[rs].maxn+=tr[u].add_tag;
tr[ls].add_tag+=tr[u].add_tag;
tr[rs].add_tag+=tr[u].add_tag;
tr[u].add_tag=0;
}
}
inline void pushdown(int u){
push_cover(u);
push_add(u);
}
void cover(int u,int l,int r,int v){
if (tr[u].l>=l&&tr[u].r<=r){
tr[u].add_tag=0;
tr[u].maxn=v;
tr[u].cover_tag=v;
return;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)/2;
if (l<=mid) cover(u<<1,l,r,v);
if (r>mid) cover((u<<1)+1,l,r,v);
push_up(u);
}
void upd(int u,int l,int r,int v){
if (tr[u].l>=l&&tr[u].r<=r){
push_cover(u);
tr[u].maxn+=v;
tr[u].add_tag+=v;
return;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)/2;
if (l<=mid) upd(u<<1,l,r,v);
if (r>mid) upd((u<<1)+1,l,r,v);
push_up(u);
}
ll query(int u,int l,int r){
if (l<=tr[u].l&&tr[u].r<=r){
return tr[u].maxn;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)/2;
ll res=-1e18;
if (l<=mid) res=max(res,query(u<<1,l,mid));
if (r>mid) res=max(res,query((u<<1)+1,mid+1,r));
return res;
}
int main (){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for (int i=1;i<=n;i++){
cin >> a[i];
}
build(1,1,n);
for (int i=1;i<=(n<<2);i++){
tr[i].cover_tag=no_cover;
}
int op,l,r;
ll x;
while (q--){
cin >> op >> l >> r;
if (op==1){
cin >> x;
cover(1,l,r,x);
}else if (op==2){
cin >> x;
upd(1,l,r,x);
}else {
cout << query(1,l,r) << endl;
}
}
return 0;
}