#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
#define pint pair<int,int>
#define f first
#define s second
#define mp make_pair
#define aF(begin,end,step,name) for(int name=begin;name<=end;name+=step)
#define oF(B,E,N) aF(B,E,1,N)
#define af(B,E,S) aF(B,E,S,i)
#define of(B,E) af(B,E,1)
#define tF(E,N) oF(1,E,N)
#define tf(E) of(1,E)
#define nF(N) tF(n,N)
#define nf() tf(n)
#define GF(x,ep) for(int ep=h[x];ep;ep=nxt[ep])
#define Gf(x) GF(x,ep)
#define gF(ep) GF(x,ep)
#define gf() Gf(x)
#define inf 1145141919810
inline ll read(){
ll x=0;
short f=1;
char c=getchar();
while(c>57||c<48){
if(c==45) f=-1;
c=getchar();
}
while(c<58&&c>47){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
inline void write(ll x){
if(x<0ll) putchar(45),x=~x+1;
if(x>9ll) write(x/10);
putchar(x%10|48);
}
#define L 2100005
int n=read(),m;
int lp[L],rp[L],s[L],v1[L],v11[L],c1[L],v2[L],v21[L],c2[L],lz[L],lz1[L],lz2[L];
#define ls (id<<1)
#define rs (ls|1)
#define len(i) (rp[i]-lp[i]+1)
void pu(int id){
s[id]=s[ls]+s[rs];
v1[id]=max(v1[ls],v1[rs]);
v2[id]=min(v2[ls],v2[rs]);
v11[id]=max(v1[ls]==v1[rs]?-inf:v1[ls]+v1[rs]-v1[id],max(v11[ls],v11[rs]));
v21[id]=min(v2[ls]==v2[rs]?inf:v2[ls]+v2[rs]-v2[id],min(v21[ls],v21[rs]));
c1[id]=(v1[id]==v1[ls])*c1[ls]+(v1[id]==v1[rs])*c1[rs];
c2[id]=(v2[id]==v2[ls])*c2[ls]+(v2[id]==v2[rs])*c2[rs];
}
void effect(int id,int v){
s[id]+=v*len(id);
v1[id]+=v;
v2[id]+=v;
if(v11[id]!=-inf)v11[id]+=v;
if(v21[id]!=inf)v21[id]+=v;
lz[id]+=v;
if(lz1[id]!=-inf)lz1[id]+=v;
if(lz2[id]!=inf)lz2[id]+=v;
}
void effect1(int id,int v){
if(v2[id]>=v)return;
s[id]+=(v-v2[id])*c2[id];
lz2[id]=max(lz2[id],v);
if(v11[id]==v2[id]) v11[id]=v;
if(v1[id]==v2[id]) v1[id]=v;
v2[id]=v;
lz1[id]=v;
}
void effect2(int id,int v){
if(v1[id]<=v)return;
s[id]+=(v-v1[id])*c1[id];
lz1[id]=min(lz1[id],v);
if(v1[id]==v21[id]) v21[id]=v;
if(v1[id]==v2[id]) v2[id]=v;
v1[id]=v;
lz2[id]=v;
}
void pd1(int id){
if(lp[id]==rp[id])return;
effect1(ls,lz1[id]);
effect1(rs,lz1[id]);
lz1[id]=-inf;
}
void pd2(int id){
if(lp[id]==rp[id])return;
effect1(ls,lz2[id]);
effect1(rs,lz2[id]);
lz2[id]=inf;
}
void pd(int id){
if(lp[id]==rp[id])return;
effect(ls,lz[id]);
effect(rs,lz[id]);
lz[id]=0;
}
void apd(int x){
if(lp[x]==rp[x])return;
if(lz[x])pd(x);
if(lz1[x]!=-inf)pd1(x);
if(lz2[x]!=inf)pd2(x);
}
void build(int id,int l,int r){
lp[id]=l;
rp[id]=r;
lz1[id]=-(lz2[id]=inf);
lz[id]=0;
if(l==r){
v11[id]=-(v21[id]=inf);
s[id]=v1[id]=v2[id]=read();
c1[id]=c2[id]=1;
return;
}
build(ls,l,l+r>>1);
build(rs,(l+r>>1)+1,r);
pu(id);
}
ll query(int id,ll l,ll r){
if(lp[id]>r||rp[id]<l) return 0ll;
if(l<=lp[id]&&rp[id]<=r) return s[id];
apd(id);
return (query(ls,l,r)+query(rs,l,r));
}
ll query1(int id,ll l,ll r){
if(lp[id]>r||rp[id]<l) return -inf;
if(l<=lp[id]&&rp[id]<=r) return v1[id];
apd(id);
return max(query1(ls,l,r),query1(rs,l,r));
}
ll query2(int id,ll l,ll r){
if(lp[id]>r||rp[id]<l) return inf;
if(l<=lp[id]&&rp[id]<=r) return v2[id];
apd(id);
return min(query2(ls,l,r),query2(rs,l,r));
}
void modify(int id,int l,int r,int k){
if(lp[id]>r||rp[id]<l) return;
if(l<=lp[id]&&rp[id]<=r){
effect(id,k);
return;
}
apd(id);
modify(ls,l,r,k);
modify(rs,l,r,k);
pu(id);
}
void modify1(int id,int l,int r,int k){
if(lp[id]>r||rp[id]<l||k<=v2[id]) return;
if(l<=lp[id]&&rp[id]<=r&&k<v21[id]){
effect1(id,k);
return;
}
apd(id);
modify1(ls,l,r,k);
modify1(rs,l,r,k);
pu(id);
}
void modify2(int id,int l,int r,int k){
if(lp[id]>r||rp[id]<l||k>=v1[id]) return;
if(l<=lp[id]&&rp[id]<=r&&k>v11[id]){
effect2(id,k);
return;
}
apd(id);
modify2(ls,l,r,k);
modify2(rs,l,r,k);
pu(id);
}
signed main(){
build(1,1,n);
m=read();
// tf(3) printf("%lld~%lld:%lld %lld %lld %lld %lld %lld %lld %lld %lld %lld\n",lp[i]\
//,rp[i],s[i],v1[i],c1[i],v11[i],v2[i],c2[i],v21[i],lz[i],lz1[i],lz2[i]);
while(m--){
int op=read();
if(op==1){
int l=read(),r=read(),k=read();
modify(1,l,r,k);
}
if(op==4){
int l=read(),r=read();
write(query(1,l,r)),putchar(10);
}
if(op==2){
int l=read(),r=read(),k=read();
modify1(1,l,r,k);
}
if(op==5){
int l=read(),r=read();
write(query1(1,l,r)),putchar(10);
}
if(op==3){
int l=read(),r=read(),k=read();
modify2(1,l,r,k);
}
if(op==6){
int l=read(),r=read();
write(query2(1,l,r)),putchar(10);
}
// tf(9) printf("%lld~%lld:%lld %lld %lld %lld %lld %lld %lld %lld %lld %lld\n",lp[i]\
//,rp[i],s[i],v1[i],c1[i],v11[i],v2[i],c2[i],v21[i],lz[i],lz1[i],lz2[i]);
}
}
题目:最假女选手
lp 和 rp:存储线段树节点表示的区间的左端点和右端点。s:存储当前节点区间的总和。v1 和 v2:存储当前节点区间的最大值和最小值。v11 和 v21:存储当前节点区间的严格次大值和严格次小值。c1 和 c2:记录最大值和最小值的出现次数。lz、lz1 和 lz2:用于懒惰更新的标记。
玄 2 关。