后五个点全WA,不知道哪挂了
#include <bits/stdc++.h>
#define low -1e11
inline long long read() {
long long x,f;char ch;
for(f=0;!isdigit(ch=getchar());f=ch=='-');
for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
return f?-x:x;
}
int n=read(),q=read();
long long a[1000001];
struct litree {
long long sum[2000001],lazy_re[2000001],lazy_ad[2000001];
int s=0,lson[2000001],rson[2000001];
inline void lad(int x) {
if(lazy_re[x]>low) {
sum[lson[x]]=sum[rson[x]]=lazy_re[lson[x]]=lazy_re[rson[x]]=lazy_re[x];
lazy_re[x]=low;
lazy_ad[lson[x]]=lazy_ad[rson[x]]=0;
}else {
sum[lson[x]]+=lazy_ad[x];sum[rson[x]]+=lazy_ad[x];
if(lazy_re[lson[x]]>low) {
lazy_re[lson[x]]+=lazy_ad[x];
}else lazy_ad[lson[x]]+=lazy_ad[x];
if(lazy_re[rson[x]]>low) {
lazy_re[rson[x]]+=lazy_ad[x];
}else lazy_ad[rson[x]]+=lazy_ad[x];
lazy_ad[x]=0;
}
return ;
}
inline void update(int x) { sum[x]=sum[lson[x]] > sum[rson[x]] ? sum[lson[x]] : sum[rson[x]]; }
inline void build(int ss,int l,int r) {
s++;
lazy_re[ss]=low;
if(l==r) {
sum[ss]=a[l];
return ;
}
int mid=(l+r)>>1;
lson[ss]=s+1;
build(s+1,l,mid);
rson[ss]=s+1;
build(s+1,mid+1,r);
update(ss);
return ;
}
inline void add(int x,int l,int r,int L,int R,long long ad_s,int job) {
if(l>R || r<L) return ;
if(l>=L && r<=R) {
if(job==1) {
lazy_re[x]=sum[x]=ad_s;
// printf("l:%d ;r:%d ;sum:%d\n",l,r,ad_s);
lazy_ad[x]=0;
}else {
if(lazy_re[x]>low) {
lazy_re[x]+=ad_s;
}else lazy_ad[x]+=ad_s;
sum[x]+=ad_s;
}
return ;
}
lad(x);
int mid=(l+r)>>1;
add(lson[x],l,mid,L,R,ad_s,job);
add(rson[x],mid+1,r,L,R,ad_s,job);
update(x);
return ;
}
inline long long find(int x,int l,int r,int L,int R) {
if(l>R || r<L) return low;
if(l>=L && r<=R) return sum[x];
lad(x);
int mid=(l+r)>>1;
long long a=find(lson[x],l,mid,L,R),b=find(rson[x],mid+1,r,L,R);
update(x);
return a>b?a:b;
}
}tree;
int main() {
for(int i=1;i<=n;i++) a[i]=read();
tree.build(1,1,n);
while(q--) {
int job=read(),l=read(),r=read();
if(job!=3) {
long long k=read();
tree.add(1,1,n,l,r,k,job);
}else printf("%d\n",tree.find(1,1,n,l,r));
}
return 0;
}