rt
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5,inf=0x3f3f3f3f3f3f3f3f;
int a[N],sum[N<<2],mx[N<<2],smx[N<<2],mi[N<<2],smi[N<<2],add[N<<2],tmx[N<<2],tmi[N<<2],cntmx[N<<2],cntmi[N<<2];
void pushup(int p)
{
int ls=p<<1,rs=p<<1|1;
sum[p]=sum[ls]+sum[rs];
mx[p]=max(mx[ls],mx[rs]);
mi[p]=min(mi[ls],mi[rs]);
if(mx[ls]==mx[rs])
{
smx[p]=max(smx[ls],smx[rs]);
cntmx[p]=cntmx[ls]+cntmx[rs];
}
else
{
smx[p]=max({smx[ls],smx[rs],min(mx[ls],mx[rs])});
cntmx[p]=(mx[ls]>mx[rs])?cntmx[ls]:cntmx[rs];
}
if(mi[ls]==mi[rs])
{
smi[p]=min(smi[ls],smi[rs]);
cntmi[p]=cntmi[ls]+cntmi[rs];
}
else
{
smi[p]=min({smi[ls],smi[rs],max(mi[ls],mi[rs])});
cntmi[p]=(mi[ls]<mi[rs])?cntmi[ls]:cntmi[rs];
}
}
void addtag1(int p,int pl,int pr,int d)
{
sum[p]+=(pr-pl+1)*d;
mx[p]+=d;
mi[p]+=d;
if(smx[p]!=-inf)smx[p]+=d;
if(smi[p]!=inf)smi[p]+=d;
if(tmx[p]!=-inf)tmx[p]+=d;
if(tmi[p]!=inf)tmi[p]+=d;
add[p]+=d;
}
void addtag2(int p,int d)
{
if(mi[p]>=d)
return ;
sum[p]+=cntmi[p]*(d-mi[p]);
tmi[p]=d;
tmx[p]=max(tmx[p],tmi[p]);
if(smx[p]==mi[p])
smx[p]=d;
if(mx[p]==mi[p])
mx[p]=d;
mi[p]=d;
}
void addtag3(int p,int d)
{
if(mx[p]<=d)
return ;
sum[p]+=cntmx[p]*(d-mx[p]);
tmx[p]=d;
tmi[p]=min(tmi[p],tmx[p]);
if(smi[p]==mx[p])
smi[p]=d;
if(mi[p]==mx[p])
mi[p]=d;
mx[p]=d;
}
void pushdown(int p,int pl,int pr)
{
int mid=(pl+pr)>>1;
if(add[p])
{
addtag1(p<<1,pl,mid,add[p]);
addtag1(p<<1|1,mid+1,pr,add[p]);
add[p]=0;
}
if(tmi[p]!=inf)
{
addtag2(p<<1,tmi[p]);
addtag2(p<<1|1,tmi[p]);
tmi[p]=inf;
}
if(tmx[p]!=-inf)
{
addtag3(p<<1,tmx[p]);
addtag3(p<<1|1,tmx[p]);
tmx[p]=-inf;
}
}
void build(int p,int pl,int pr)
{
if(pl==pr)
{
add[p]=0;
sum[p]=mx[p]=mi[p]=a[pl];
smx[p]=tmx[p]=-inf;
smi[p]=tmi[p]=inf;
cntmx[p]=cntmi[p]=1;
return ;
}
int mid=(pl+pr)>>1;
build(p<<1,pl,mid);
build(p<<1|1,mid+1,pr);
pushup(p);
}
void update1(int p,int pl,int pr,int L,int R,int d)
{
if(R<pl||pr<L)
return ;
if(L<=pl&&pr<=R)
{
addtag1(p,pl,pr,d);
return ;
}
int mid=(pl+pr)>>1;
pushdown(p,pl,pr);
update1(p<<1,pl,mid,L,R,d);
update1(p<<1|1,mid+1,pr,L,R,d);
pushup(p);
}
void update2(int p,int pl,int pr,int L,int R,int d)
{
if(R<pl||pr<L)
return ;
if(mi[p]>=d)
return ;
if(L<=pl&&pr<=R&&d<smi[p])
{
if(pl!=pr)
pushdown(p,pl,pr);
addtag2(p,d);
return ;
}
int mid=(pl+pr)>>1;
pushdown(p,pl,pr);
update2(p<<1,pl,mid,L,R,d);
update2(p<<1|1,mid+1,pr,L,R,d);
pushup(p);
}
void update3(int p,int pl,int pr,int L,int R,int d)
{
if(R<pl||pr<L)
return ;
if(mx[p]<=d)
return ;
if(L<=pl&&pr<=R&&d>smx[p])
{
if(pl!=pr)
pushdown(p,pl,pr);
addtag3(p,d);
return ;
}
int mid=(pl+pr)>>1;
pushdown(p,pl,pr);
update3(p<<1,pl,mid,L,R,d);
update3(p<<1|1,mid+1,pr,L,R,d);
pushup(p);
}
int query1(int p,int pl,int pr,int L,int R)
{
if(R<pl||pr<L)
return 0;
if(L<=pl&&pr<=R)
return sum[p];
pushdown(p,pl,pr);
int mid=(pl+pr)>>1;
return query1(p<<1,pl,mid,L,R)+query1(p<<1|1,mid+1,pr,L,R);
}
int query2(int p,int pl,int pr,int L,int R)
{
if(R<pl||pr<L)
return -inf;
if(L<=pl&&pr<=R)
return mx[p];
pushdown(p,pl,pr);
int mid=(pl+pr)>>1;
return max(query2(p<<1,pl,mid,L,R),query2(p<<1|1,mid+1,pr,L,R));
}
int query3(int p,int pl,int pr,int L,int R)
{
if(R<pl||pr<L)
return inf;
if(L<=pl&&pr<=R)
return mi[p];
pushdown(p,pl,pr);
int mid=(pl+pr)>>1;
return min(query3(p<<1,pl,mid,L,R),query3(p<<1|1,mid+1,pr,L,R));
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i];
build(1,1,n);
cin>>m;
while(m--)
{
int op,l,r,k;
cin>>op>>l>>r;
if(op==1)
{
cin>>k;
update1(1,1,n,l,r,k);
}
if(op==2)
{
cin>>k;
update2(1,1,n,l,r,k);
}
if(op==3)
{
cin>>k;
update3(1,1,n,l,r,k);
}
if(op==4)
cout<<query1(1,1,n,l,r)<<'\n';
if(op==5)
cout<<query2(1,1,n,l,r)<<'\n';
if(op==5)
cout<<query3(1,1,n,l,r)<<'\n';
}
}