可以认为数据基本随机,于是可以直接用线段树维护,对每个询问在线段树上进行剪枝搜索。
#include<bits/stdc++.h> typedef long long i64; char ib[10000007],*ip=ib,ob[10000007],*op=ob; int _(){ int x=0; while(*ip<48)++ip; while(*ip>47)x=x*10+*ip++-48; return x; } void pr(i64 x){ int ss[24],sp=0; do ss[++sp]=x%10;while(x/=10); while(sp)*op++=ss[sp--]+48; *op++=10; } i64 max(i64 a,i64 b){return a>b?a:b;} int n,m,seed,_l,_r; i64 A,B,C,ans; int mt(){ seed=(seed*100000005ll+20150609)%998244353; return seed/100; } struct node{ node*lc,*rc; int L,R,M; int rv; i64 y1,y2,xy1,xy2; void _rv(){ std::swap(y1,y2); std::swap(xy1,xy2); rv^=1; } void dn(){ if(rv){ rv=0; lc->_rv(); rc->_rv(); } } void up(){ y1=max(lc->y1,rc->y1); y2=max(lc->y2,rc->y2); xy1=max(lc->xy1,rc->xy1); xy2=max(lc->xy2,rc->xy2); } void init(int v){ y1=v,y2=100000-v; xy1=i64(L)*y1,xy2=i64(L)*y2; } void chg(){ if(L==R)return init(A); dn(); (_l<=M?lc:rc)->chg(); up(); } void rev(){ if(_l<=L&&R<=_r)return _rv(); dn(); if(_l<=M)lc->rev(); if(_r>M)rc->rev(); up(); } i64 cal(){ return A*R+B*y1+C*xy1; } void find(i64 v){ if(_l>R||_r<L||v<=ans)return; if(L==R)return void(ans=v); dn(); i64 vl=lc->cal(),vr=rc->cal(); if(vl>vr)lc->find(vl),rc->find(vr); else rc->find(vr),lc->find(vl); } }ns[200007],*np=ns,*rt; node*build(int L,int R){ node*w=np++; w->L=L,w->R=R; if(L<R){ int M=w->M=L+R>>1; w->lc=build(L,M); w->rc=build(M+1,R); w->up(); }else w->init(mt()%100001); return w; } int main(){ fread(ib,1,sizeof(ib),stdin); n=_(),m=_(),seed=_(); rt=build(1,n); while(m--){ int o=_(); if(o=='C'-48){ _l=mt()%n+1,A=mt()%100001; rt->chg(); }else{ _l=mt()%n+1,_r=mt()%n+1; if(_l>_r)std::swap(_l,_r); if(o=='R'-48){ rt->rev(); }else{ A=_(),B=_(),C=_(); ans=0; if(A|B|C)rt->find(rt->cal()); pr(ans); } } } fwrite(ob,1,op-ob,stdout); return 0; }