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
| #include <bits/stdc++.h> using namespace std;
typedef long long ll; ll qpow(ll a,ll b,ll p){ll r=1;for(;b;b>>=1,a=a*a%p)if(b&1)r=r*a%p;return r;} typedef map<int,ll>::iterator IT; IT split(map<int,ll>&t,int x){ IT it=t.lower_bound(x); if(it->first==x) return it; return t.emplace(x,(--it)->second).first; } void assign(map<int,ll>&t,int l,int r,int w){ t.erase(split(t,l),split(t,r+1)), t.emplace(l,w); } void add(map<int,ll>&t,int l,int r,int w){ for(IT i=split(t,l),j=split(t,r+1);i!=j;++i) i->second+=w; } int sum(map<int,ll>&t,int l,int r,int y,int p){ int res=0; for(IT j=split(t,l),k=split(t,r+1),i=j++;i!=k;i=j++) { res=(res+qpow(i->second%p,y,p)*(j->first-i->first))%p; } return res; } ll kth(map<int,ll>&t,int l,int r,int k){ vector<pair<ll,int>>v; for(IT j=split(t,l),k=split(t,r+1),i=j++;i!=k;i=j++) { v.emplace_back(i->second,j->first-i->first); } sort(v.begin(),v.end()); for(auto x:v) { if(k<=x.second) return x.first; else k-=x.second; } assert(false); }
ll seed; ll rnd(){ ll ret = seed; seed = (seed * 7 + 13) % 1000000007; return ret; }
int main(){ map<int,ll>tr; int n,m,vmax; cin>>n>>m>>seed>>vmax; for(int i=1;i<=n;i++) tr[i]=rnd()%vmax+1; tr[n+1]=-1; int op,l,r,x,y; for(int i=1;i<=m;i++) { op=rnd()%4+1,l=rnd()%n+1,r=rnd()%n+1; if(l>r)swap(l,r); if(op==3) x=rnd()%(r-l+1)+1; else x=rnd()%vmax+1; if(op==4) y=rnd()%vmax+1; switch(op){ case 1:add(tr,l,r,x);break; case 2:assign(tr,l,r,x);break; case 3:printf("%lld\n",kth(tr,l,r,x));break; case 4:printf("%d\n",sum(tr,l,r,x,y));break; } } }
|