1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| #define int LL const int N=200010,M=N*2,mod=1e9+7; struct Node{ int l,r; mutable int v; Node(int _l,int _r,int _v):l(_l),r(_r),v(_v){}; bool operator<(const Node &W)const{return l<W.l;} }; set<Node> ds; int n,m,seed,vmx; int sum=n;
set<Node>::iterator split(int pos){ auto now=ds.lower_bound(Node(pos,0,0)); if(now!=ds.end() && now->l == pos) return now; now --; int l=now->l,r=now->r,v=now->v;; ds.erase(now); ds.insert(Node(l,pos-1,v)); return ds.insert(Node(pos, r, v)).x; }
void assign(int l,int r,int v){ int tot = 0; auto end=split(r+1),begin=split(l); ds.erase(begin, end); ds.insert(Node(l,r,v)); }
void add(int l,int r,int v){ auto begin=split(l),end=split(r+1); for(;begin!=end;begin++) begin->v += v; }
int kth(int l,int r,int k){ vector<pair<int,int>> tmp; auto begin=split(l),end=split(r+1); for(;begin!=end;begin++) tmp.push_back({begin->v, begin->r-begin->l+1}); sort(tmp.begin(), tmp.end()); for(auto u:tmp){ k -= u.y; if(k<=0) return u.x; } return -1; }
int sum_of_pow(int l,int r,int x,int y){ int tot=0; auto begin=split(l),end=split(r+1); for(;begin!=end;begin++){ tot = (tot + fpower(begin->v, x, y) * (begin->r-begin->l+1) % y)%y; } return tot; } LL rnd() { LL ret = seed; seed = (seed * 7 + 13) % 1000000007; return ret; } void solve(){ n=read(),m=read(),seed=read(),vmx=read(); rep(i,1,n){ int r=rnd(); ds.insert(Node(i, i, r%vmx+1)); } while(m--){ LL ty=rnd()%4+1,l=rnd()%n+1,r=rnd()%n+1,x,y; if(l>r) swap(l,r); if(ty==3) x=rnd()%(r-l+1)+1; else x=rnd()%vmx+1; if(ty==4) y=rnd()%vmx+1;
if(ty==1){ add(l,r,x); } else if(ty==2){ assign(l,r,x); } else if(ty==3){ print(kth(l, r, x)); } else{ print(sum_of_pow(l ,r, x, y)); } } }
|