#include<algorithm>#include<cstdint>#include<iostream>usingi64=int64_t;constexprintN=300010;constexpri64INF=1145141919810114514ll;intn,q,op,l,r;inta[N],b[N];intlc(intu){return(u<<1);}intrc(intu){return(u<<1)|1;}structnode{i64mx_ab[2][2];// 0: not max A or B; 1: is max A or Bi64max_val(){returnstd::max({mx_ab[0][0],mx_ab[0][1],mx_ab[1][0],mx_ab[1][1]});}i64mx1[2],mx2[2];// 0: A; 1: Bi64tag_add[2],tag_mn[2];voidclr_tag(){tag_add[0]=tag_add[1]=0,tag_mn[0]=tag_mn[1]=INF;}voidinit(i64a,i64b){mx1[0]=a,mx1[1]=b,mx2[0]=mx2[1]=-INF;mx_ab[1][1]=a+b,mx_ab[0][1]=mx_ab[1][0]=mx_ab[0][0]=-INF;}voidmodify_mn(i64tg,boolid)// id 0: A; 1: B{if(mx1[id]<=tg)return;mx_ab[1][1]+=(mx_ab[1][1]>-INF)?(tg-mx1[id]):0;mx_ab[!id][id]+=(mx_ab[!id][id]>-INF)?(tg-mx1[id]):0;mx1[id]=tag_mn[id]=tg;}voidmodify_add(i64tg,boolid)// id 0: A; 1: B{for(inti=0;i<2;++i)for(intj=0;j<2;++j)mx_ab[i][j]+=(mx_ab[i][j]>-INF)?tg:0;mx1[id]+=tg,mx2[id]+=(mx2[id]>-INF)?tg:0;tag_mn[id]+=(tag_mn[id]<INF)?tg:0,tag_add[id]+=tg;}voidpushup(constnode&l,constnode&r){for(inti=0;i<2;++i){if(l.mx1[i]==r.mx1[i])mx1[i]=l.mx1[i],mx2[i]=std::max(l.mx2[i],r.mx2[i]);elseif(l.mx1[i]>r.mx1[i])mx1[i]=l.mx1[i],mx2[i]=std::max(l.mx2[i],r.mx1[i]);elsemx1[i]=r.mx1[i],mx2[i]=std::max(l.mx1[i],r.mx2[i]);}if(l.mx1[0]==mx1[0]&&l.mx1[1]==mx1[1]){mx_ab[1][1]=l.mx_ab[1][1],mx_ab[0][1]=l.mx_ab[0][1];mx_ab[1][0]=l.mx_ab[1][0],mx_ab[0][0]=l.mx_ab[0][0];}elseif(l.mx1[0]==mx1[0]&&l.mx1[1]!=mx1[1]){mx_ab[1][1]=mx_ab[0][1]=-INF;mx_ab[1][0]=std::max(l.mx_ab[1][1],l.mx_ab[1][0]);mx_ab[0][0]=std::max(l.mx_ab[0][1],l.mx_ab[0][0]);}elseif(l.mx1[0]!=mx1[0]&&l.mx1[1]==mx1[1]){mx_ab[1][1]=mx_ab[1][0]=-INF;mx_ab[0][1]=std::max(l.mx_ab[1][1],l.mx_ab[0][1]);mx_ab[0][0]=std::max(l.mx_ab[1][0],l.mx_ab[0][0]);}else{mx_ab[1][1]=mx_ab[0][1]=mx_ab[1][0]=-INF;mx_ab[0][0]=std::max({l.mx_ab[0][0],l.mx_ab[0][1],l.mx_ab[1][0],l.mx_ab[1][1]});}if(r.mx1[0]==mx1[0]&&r.mx1[1]==mx1[1]){mx_ab[1][1]=std::max(mx_ab[1][1],r.mx_ab[1][1]);mx_ab[0][1]=std::max(mx_ab[0][1],r.mx_ab[0][1]);mx_ab[1][0]=std::max(mx_ab[1][0],r.mx_ab[1][0]);mx_ab[0][0]=std::max(mx_ab[0][0],r.mx_ab[0][0]);}elseif(r.mx1[0]==mx1[0]&&r.mx1[1]!=mx1[1]){mx_ab[1][0]=std::max({mx_ab[1][0],r.mx_ab[1][1],r.mx_ab[1][0]});mx_ab[0][0]=std::max({mx_ab[0][0],r.mx_ab[0][1],r.mx_ab[0][0]});}elseif(r.mx1[0]!=mx1[0]&&r.mx1[1]==mx1[1]){mx_ab[0][1]=std::max({mx_ab[0][1],r.mx_ab[1][1],r.mx_ab[0][1]});mx_ab[0][0]=std::max({mx_ab[0][0],r.mx_ab[1][0],r.mx_ab[0][0]});}elsemx_ab[0][0]=std::max({mx_ab[0][0],r.mx_ab[0][0],r.mx_ab[0][1],r.mx_ab[1][0],r.mx_ab[1][1]});}}tr[N<<2];voidpushup(intu){tr[u].pushup(tr[lc(u)],tr[rc(u)]);}voidpushdown(intu){for(inti=0;i<2;++i)if(tr[u].tag_add[i])tr[lc(u)].modify_add(tr[u].tag_add[i],i),tr[rc(u)].modify_add(tr[u].tag_add[i],i);for(inti=0;i<2;++i)if(tr[u].tag_mn[i]<INF)tr[lc(u)].modify_mn(tr[u].tag_mn[i],i),tr[rc(u)].modify_mn(tr[u].tag_mn[i],i);tr[u].clr_tag();}void_build(intu,intL,intR){tr[u].clr_tag();if(L==R)returntr[u].init(a[L],b[L]);intM=(L+R)>>1;_build(lc(u),L,M),_build(rc(u),M+1,R),pushup(u);}voidbuild(){_build(1,1,n);}void_modify_mn(intu,intl,intr,intL,intR,intv,booli){if(L>r||R<l||tr[u].mx1[i]<=v)return;if(l<=L&&R<=r&&tr[u].mx2[i]<v)returntr[u].modify_mn(v,i);pushdown(u);intM=(L+R)>>1;_modify_mn(lc(u),l,r,L,M,v,i),_modify_mn(rc(u),l,r,M+1,R,v,i);pushup(u);}voidmodify_mn(intl,intr,intv,booli){_modify_mn(1,l,r,1,n,v,i);}void_modify_add(intu,intl,intr,intL,intR,intv,booli){if(L>r||R<l)return;if(l<=L&&R<=r)returntr[u].modify_add(v,i);pushdown(u);intM=(L+R)>>1;_modify_add(lc(u),l,r,L,M,v,i),_modify_add(rc(u),l,r,M+1,R,v,i);pushup(u);}voidmodify_add(intl,intr,intv,booli){_modify_add(1,l,r,1,n,v,i);}node_query(intu,intl,intr,intL,intR){if(l<=L&&R<=r)returntr[u];pushdown(u);intM=(L+R)>>1;if(r<=M)return_query(lc(u),l,r,L,M);if(l>M)return_query(rc(u),l,r,M+1,R);noderet;node_l=_query(lc(u),l,M,L,M),_r=_query(rc(u),M+1,r,M+1,R);ret.pushup(_l,_r);returnret;}nodequery(intl,intr){return_query(1,l,r,1,n);}usingstd::cin;usingstd::cout;intmain(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n>>q;for(inti=1;i<=n;++i)cin>>a[i];for(inti=1;i<=n;++i)cin>>b[i];build();while(q--){cin>>op>>l>>r;intx;switch(op){case1:cin>>x;modify_mn(l,r,x,0);break;case2:cin>>x;modify_mn(l,r,x,1);break;case3:cin>>x;modify_add(l,r,x,0);break;case4:cin>>x;modify_add(l,r,x,1);break;case5:cout<<query(l,r).max_val()<<'\n';break;default:break;}}}
#include<algorithm>#include<climits>#include<iostream>usingnamespacestd;usingll=longlong;constexprintN=1e5+7;structTree{intmx,_mx;// 区间最大值 区间历史最大值intad,_ad;// 区间加标记 区间阶段历史最大加标记intst,_st;// 区间修改值 区间阶段历史最大修改标记}g[N*4];inta[N];intn,m;#define ls u * 2#define rs u * 2 + 1#define mid (l + r) / 2voidpushup(intu){g[u].mx=max(g[ls].mx,g[rs].mx);g[u]._mx=max(g[ls]._mx,g[rs]._mx);}voidpushadd(intu,intv,int_v){g[u]._mx=max(g[u]._mx,g[u].mx+_v),g[u].mx+=v;if(g[u].st==INT_MIN)g[u]._ad=max(g[u]._ad,g[u].ad+_v),g[u].ad+=v;elseg[u]._st=max(g[u]._st,g[u].st+_v),g[u].st+=v;}voidpushset(intu,intv,int_v){g[u]._mx=max(g[u]._mx,_v),g[u].mx=v;g[u]._st=max(g[u]._st,_v),g[u].st=v;}voidpushdown(intu,intl,intr){if(g[u].ad||g[u]._ad)pushadd(ls,g[u].ad,g[u]._ad),pushadd(rs,g[u].ad,g[u]._ad),g[u].ad=g[u]._ad=0;if(g[u].st!=INT_MIN||g[u]._st!=INT_MIN)pushset(ls,g[u].st,g[u]._st),pushset(rs,g[u].st,g[u]._st),g[u].st=g[u]._st=INT_MIN;}voidbuild(intu=1,intl=1,intr=n){g[u]._st=g[u].st=INT_MIN;if(l==r){g[u].mx=a[l];g[u]._mx=a[l];return;}build(ls,l,mid),build(rs,mid+1,r);pushup(u);}intL,R;voidadd(intv,intu=1,intl=1,intr=n){if(R<l||r<L)return;if(L<=l&&r<=R)returnpushadd(u,v,max(v,0));pushdown(u,l,r);add(v,ls,l,mid),add(v,rs,mid+1,r);pushup(u);}voidtset(intv,intu=1,intl=1,intr=n){if(R<l||r<L)return;if(L<=l&&r<=R)returnpushset(u,v,v);pushdown(u,l,r);tset(v,ls,l,mid),tset(v,rs,mid+1,r);pushup(u);}intqmax(intu=1,intl=1,intr=n){if(R<l||r<L)returnINT_MIN;if(L<=l&&r<=R)returng[u].mx;pushdown(u,l,r);returnmax(qmax(ls,l,mid),qmax(rs,mid+1,r));}intqmaxh(intu=1,intl=1,intr=n){if(R<l||r<L)returnINT_MIN;if(L<=l&&r<=R)returng[u]._mx;pushdown(u,l,r);returnmax(qmaxh(ls,l,mid),qmaxh(rs,mid+1,r));}intmain(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n;for(inti=1;i<=n;++i)cin>>a[i];build();intm,z;cin>>m;for(inti=1;i<=m;++i){charop;cin>>op;while(op==' '||op=='\r'||op=='\n')cin>>op;cin>>L>>R;intx;if(op=='Q')cout<<qmax()<<'\n';elseif(op=='A')cout<<qmaxh()<<'\n';elseif(op=='P')cin>>x,add(x);elsecin>>x,tset(x);}return0;}
Last updated on this page:, Update history Found an error? Want to help improve? Edit this page on GitHub! Contributors to this page:OI-wiki All content on this page is provided under the terms of the CC BY-SA 4.0 and SATA license, additional terms may apply