#include<bits/stdc++.h>
using namespace std;
struct node{
int maxn,minn,maxncnt,minncnt,sum,maxnh,minnf;
}w[4000001];
int opt,n,m,a[500001];
int lazya[500001],lazym[500001],lazys[500001],l,r,x;
int ls(int x){
return x<<1;
}
int rs(int x)
{
return x<<1|1;
}
void pushup(int x)
{
w[x].sum=w[ls(x)].sum+w[rs(x)].sum;
if(w[ls(x)].maxn==w[rs(x)].maxn)
{
w[x].maxn=w[ls(x)].maxn;
w[x].maxncnt=w[ls(x)].maxncnt+w[rs(x)].maxncnt;
w[x].maxnh=max(w[ls(x)].maxnh,w[rs(x)].maxnh);
}
else if(w[ls(x)].maxn>w[rs(x)].maxn)
{
w[x].maxn=w[ls(x)].maxn;
w[x].maxncnt=w[ls(x)].maxncnt;
w[x].maxnh=max(w[ls(x)].maxnh,w[rs(x)].maxn);
}
else {
w[x].maxn=w[rs(x)].maxn;
w[x].maxncnt=w[rs(x)].maxncnt;
w[x].maxnh=max(w[ls(x)].maxn,w[rs(x)].maxnh);
}
if(w[ls(x)].minn==w[rs(x)].minn)
{
w[x].minncnt=w[ls(x)].minncnt+w[rs(x)].minncnt;
w[x].minn=w[ls(x)].minn;
w[x].minnf=min(w[ls(x)].minnf,w[rs(x)].minnf);
}
else if(w[ls(x)].minn<w[rs(x)].minn)
{
w[x].minn=w[ls(x)].minn;
w[x].minncnt=w[ls(x)].minncnt;
w[x].minnf=min(w[rs(x)].minn,w[ls(x)].minnf);
}
else {
w[x].minn=w[rs(x)].minn;
w[x].minncnt=w[rs(x)].minncnt;
w[x].minnf=min(w[rs(x)].minnf,w[ls(x)].minn);
}
}
void build(int l,int r,int x)
{
if(l>r)return;
if(l==r){
w[x].sum=a[l];
w[x].maxn=a[l];
w[x].minn=a[l];
w[x].maxncnt=1;
w[x].minncnt=1;
w[x].minnf=INT_MAX;
w[x].maxnh=INT_MIN;
lazym[x]=INT_MIN;
lazys[x]=INT_MAX;
lazya[x]=0;
return;
}
int mid=l+r>>1;
build(l,mid,ls(x));
build(mid+1,r,rs(x));
pushup(x);
}
void pushadd(int x,int l,int r,int k)
{
w[x].sum+=(r-l+1)*k;
lazya[x]+=k;
w[x].maxn+=k;
w[x].minn+=k;
if(w[x].minnf!=INT_MAX)w[x].minnf+=k;
if(w[x].maxnh!=INT_MIN)w[x].maxnh+=k;
if(lazym[x]!=INT_MIN)lazym[x]+=k;
if(lazys[x]!=INT_MAX)lazys[x]+=k;
}
void pushmin(int x,int l,int r,int k)
{
if(w[x].minn>=k)return;
w[x].sum+=(k-w[x].minn)*w[x].minncnt;
if(w[x].maxnh==w[x].minn)
w[x].maxnh=k;
if(w[x].maxn==w[x].minn)
w[x].maxn=k;
if(lazys[x]<k)
lazys[x]=k;
w[x].minn=k;
lazym[x]=k;
}
void pushmax(int x,int l,int r,int k)
{
if(w[x].maxn<=k)return;
w[x].sum+=(k-w[x].maxn)*w[x].maxncnt;
if(w[x].minnf==w[x].maxn)
w[x].minnf=k;
if(w[x].maxn==w[x].minn)
w[x].minn=k;
if(lazym[x]>k)
lazym[x]=k;
w[x].maxn=k;
lazys[x]=k;
}
void pushdown(int l,int r,int x)
{
int mid=l+r>>1;
if(lazya[x])
{
pushadd(ls(x),l,mid,lazya[x]);
pushadd(rs(x),mid+1,r,lazya[x]);
}
if(lazym[x]!=INT_MIN)
{
pushmax(ls(x),l,mid,lazym[x]);
pushmax(rs(x),mid+1,r,lazym[x]);
}
if(lazys[x]!=INT_MAX)
{
pushmin(ls(x),l,mid,lazys[x]);
pushmax(rs(x),mid+1,r,lazys[x]);
}
lazys[x]=INT_MAX;
lazym[x]=INT_MIN;
lazya[x]=0;
}
void updateadd(int l,int r,int x,int L,int R,int k)
{
if(R<l||r<L)return;
if(L<=l&&r<=R)
{
pushadd(x,l,r,k);
return;
}
pushdown(l,r,x);
int mid=l+r>>1;
updateadd(l,mid,ls(x),L,R,k);
updateadd(mid+1,r,rs(x),L,R,k);
pushup(x);
}
void updatemin(int l,int r,int x,int L,int R,int k)
{
if(R<l||r<L||w[x].minn>=k)return;
if(L<=l&&r<=R&&w[x].minnf>k)
{
pushmin(x,l,r,k);
return;
}
pushdown(l,r,x);
int mid=l+r>>1;
updatemin(l,mid,ls(x),L,R,k);
updatemin(mid+1,r,rs(x),L,R,k);
pushup(x);
}
void updatemax(int l,int r,int x,int L,int R,int k)
{
if(R<l||r<L||w[x].maxn<=k)return;
if(L<=l&&r<=R&&w[x].maxnh<k)
{
pushmax(x,l,r,k);
return;
}
pushdown(l,r,x);
int mid=l+r>>1;
updatemax(l,mid,ls(x),L,R,k);
updatemax(mid+1,r,rs(x),L,R,k);
pushup(x);
}
int queryadd(int l,int r,int x,int L,int R)
{
if(R<l||r<L)return 0;
if(L<=l&&r<=R)
{
return w[x].sum;
}
pushdown(l,r,x);
int mid=l+r>>1,ans=0;
ans+=queryadd(l,mid,ls(x),L,R);
ans+=queryadd(mid+1,r,rs(x),L,R);
return ans;
}
int querymax(int l,int r,int x,int L,int R)
{
if(R<l||r<L)return INT_MIN;
if(L<=l&&r<=R)
{
return w[x].maxn;
}
pushdown(l,r,x);
int mid=l+r>>1,ans=0;
ans=max(ans,querymax(l,mid,ls(x),L,R));
ans=max(ans,querymax(mid+1,r,rs(x),L,R));
return ans;
}
int querymin(int l,int r,int x,int L,int R)
{
if(R<l||r<L)return INT_MAX;
if(L<=l&&r<=R)
{
return w[x].minn;
}
pushdown(l,r,x);
int mid=l+r>>1,ans=0;
ans=min(ans,querymin(l,mid,ls(x),L,R));
ans=min(ans,querymin(mid+1,r,rs(x),L,R));
return ans;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>opt;
if(opt==1)
{
cin>>l>>r>>x;
updateadd(1,n,1,l,r,x);
}
if(opt==2)
{
cin>>l>>r>>x;
updatemin(1,n,1,l,r,x);
}
if(opt==3)
{
cin>>l>>r>>x;
updatemax(1,n,1,l,r,x);
}
if(opt==4)
{
cin>>l>>r;
cout<<queryadd(1,n,1,l,r)<<endl;
}
if(opt==5)
{
cin>>l>>r;
cout<<querymax(1,n,1,l,r)<<endl;
}
if(opt==6)
{
cin>>l>>r;
cout<<querymin(1,n,1,l,r)<<endl;
}
}
}
//sum区间和 maxn区间最大值 maxcnt区间最大值个数 minn区间最小值 minncnt区间最小值个数 minnf区间次小值 maxnh区间次大值 lazym区间最大值标记 lazys区间最小值标记 lazya区间加标记
大佬求求了喵