0pts,求助。
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline void write(int x){
if(x==0){putchar('0');return;}
int len=0,k1=x,c[10005];
if(k1<0)k1=-k1,putchar('-');
while(k1)c[len++]=k1%10+'0',k1/=10;
while(len--)putchar(c[len]);
}
const int N=5e5+10;
int a[N];
struct SGT{
int mx[N<<2],mx2[N<<2],mn[N<<2],mn2[N<<2],smx[N>>2],smn[N>>2];
int add[N<<2],tr[N<<2],tmx[N<<2],tmn[N<<2];
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
void push_up(int p){
tr[p]=tr[ls(p)]+tr[rs(p)];
if(mx[ls(p)]==mx[rs(p)]){
mx[p]=mx[ls(p)],smx[p]=smx[ls(p)]+smx[rs(p)];
mx2[p]=max(mx2[ls(p)],mx2[rs(p)]);
}
else if(mx[ls(p)]>mx[rs(p)]){
mx[p]=mx[ls(p)],smx[p]=smx[ls(p)];
mx2[p]=max(mx2[ls(p)],mx[rs(p)]);
}
else{
mx[p]=mx[rs(p)],smx[p]=smx[rs(p)];
mx2[p]=max(mx2[rs(p)],mx[ls(p)]);
}
if(mn[ls(p)]==mn[rs(p)]){
mn[p]=mn[ls(p)],smn[p]=smn[ls(p)]+smn[rs(p)];
mn2[p]=min(mn2[ls(p)],mn2[rs(p)]);
}
else if(mn[ls(p)]<mn[rs(p)]){
mn[p]=mn[ls(p)],smn[p]=smn[ls(p)];
mn2[p]=min(mn2[ls(p)],mn[rs(p)]);
}
else{
mn[p]=mn[rs(p)],smn[p]=smn[rs(p)];
mn2[p]=min(mn2[rs(p)],mn[ls(p)]);
}
}
void build(int p,int pl,int pr){
tmn[p]=INT_MAX,tmx[p]=INT_MIN;
if(pl==pr){
tr[p]=mn[p]=mx[p]=a[pl];
mn2[p]=INT_MAX,mx2[p]=INT_MIN;
smx[p]=smn[p]=1;
return ;
}
int mid=(pl+pr)>>1;
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
push_up(p);
}
void add_tag(int p,int pl,int pr,int d){
mx[p]+=d,mn[p]+=d,add[p]+=d;
tr[p]+=d*(pr-pl+1);
if(mx2[p]!=INT_MIN)mx2[p]+=d;
if(mn2[p]!=INT_MAX)mn2[p]+=d;
if(tmn[p]!=INT_MAX)tmn[p]+=d;
if(tmx[p]!=INT_MIN)tmx[p]+=d;
}
void max_tag(int p,int d){
if(mn[p]>d)return ;
tr[p]+=(d-mn[p])*smn[p];
if(mx[p]==mn[p])mx[p]=d;
if(mx2[p]==mn[p])mx2[p]=d;
if(tmn[p]<d)tmn[p]=d;
mn[p]=d,tmx[p]=d;
}
void min_tag(int p,int d){
if(mx[p]<=d)return ;
tr[p]+=(d-mx[p])*smx[p];
if(mn[p]==mx[p])mn[p]=d;
if(mn2[p]==mx[p])mn2[p]=d;
if(tmx[p]>d)tmx[p]=d;
mx[p]=d,tmn[p]=d;
}
void push_down(int p,int pl,int pr){
if(add[p]){
int mid=(pl+pr)>>1;
add_tag(ls(p),pl,mid,add[p]);
add_tag(rs(p),mid+1,pr,add[p]);
add[p]=0;
}
if(tmx[p]!=INT_MIN){
max_tag(ls(p),tmx[p]);
max_tag(rs(p),tmx[p]);
tmx[p]=INT_MIN;
}
if(tmn[p]!=INT_MAX){
min_tag(ls(p),tmn[p]);
min_tag(rs(p),tmn[p]);
tmn[p]=INT_MAX;
}
}
void Add(int l,int r,int p,int pl,int pr,int d){
if(l<=pl&&pr<=r){
add_tag(p,pl,pr,d);
return ;
}
int mid=(l+r)>>1;
push_down(p,pl,pr);
if(l<=mid)Add(l,r,ls(p),l,mid,d);
if(r>mid)Add(l,r,rs(p),mid+1,r,d);
push_up(p);
}
void Mmax(int l,int r,int p,int pl,int pr,int d){
if(mn[p]>=d)return ;
if(l<=pl&&pr<=r&&mn2[p]>d){
max_tag(p,d);
return ;
}
int mid=(l+r)>>1;
push_down(p,pl,pr);
if(l<=mid)Mmax(l,r,ls(p),l,mid,d);
if(r>mid)Mmax(l,r,rs(p),mid+1,r,d);
push_up(p);
}
void Mmin(int l,int r,int p,int pl,int pr,int d){
if(mx[p]<=d)return ;
if(l<=pl&&pr<=r&&mx2[p]<d){
min_tag(p,d);
return ;
}
int mid=(l+r)>>1;
push_down(p,pl,pr);
if(l<=mid)Mmin(l,r,ls(p),l,mid,d);
if(r>mid)Mmin(l,r,rs(p),mid+1,r,d);
push_up(p);
}
int Qsum(int l,int r,int p,int pl,int pr){
if(l<=pl&&pr<=r)return tr[p];
push_down(p,pl,pr);
int res=0,mid=(pl+pr)>>1;
if(l<=mid)res+=Qsum(l,r,ls(p),pl,mid);
if(r>mid)res+=Qsum(l,r,rs(p),mid+1,pr);
return res;
}
int Qmax(int l,int r,int p,int pl,int pr){
if(l<=pl&&pr<=r)return mx[p];
push_down(p,pl,pr);
int res=INT_MIN,mid=(pl+pr)>>1;
if(l<=mid)res=max(Qmax(l,r,ls(p),pl,mid),res);
if(r>mid)res=max(Qmax(l,r,rs(p),mid+1,pr),res);
return res;
}
int Qmin(int l,int r,int p,int pl,int pr){
if(l<=pl&&pr<=r)return mn[p];
push_down(p,pl,pr);
int res=INT_MAX,mid=(pl+pr)>>1;
if(l<=mid)res=min(Qmin(l,r,ls(p),pl,mid),res);
if(r>mid)res=min(Qmin(l,r,rs(p),mid+1,pr),res);
return res;
}
}sgt;
signed main(){
int n=read();
for(int i=1;i<=n;i++)a[i]=read();
sgt.build(1,1,n);
int m=read();
while(m--){
int op=read(),l=read(),r=read();
if(op==1){
int x=read();
sgt.Add(l,r,1,1,n,x);
}
else if(op==2){
int x=read();
sgt.Mmax(l,r,1,1,n,x);
}
else if(op==3){
int x=read();
sgt.Mmin(l,r,1,1,n,x);
}
else if(op==4)write(sgt.Qsum(l,r,1,1,n)),puts("");
else if(op==5)write(sgt.Qmax(l,r,1,1,n)),puts("");
else write(sgt.Qmin(l,r,1,1,n)),puts("");
}
return 0;
}