此程序没有任何输出:(
#include<bits/stdc++.h>
using namespace std;
int n,m,seed,vmax;
int rnd(){
int ret=seed;
seed=(seed*7+13)%1000000007;
return ret;
}
int a[100001];
struct node{
int l,r;
mutable int v;
node(int l,int r=0,int v=0):l(l),r(r),v(v){}
bool operator < (const node &o) const{
return l<o.l;
}
};
set<node> s;
#define IT set<node>::iterator
int qpow(int a,int b,int mod){
int ans=1;
if(b&1) ans=ans*a%mod;
while(b>>=1){
ans=(long long)ans*a*a%mod;
}
return ans;
}
IT devide(int pos){
IT it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos) return it;
--it;
int L=it->l,R=it->r,V=it->v;
s.erase(it);
s.insert(node(L,pos-1,V));
return s.insert(node(pos,R,V)).first;
}
void change(int l,int r,int v){
IT itr=devide(r+1),itl=devide(l);
s.erase(itl,itr);
s.insert(node(l,r,v));
}
void add(int l,int r,int v){
IT itr=devide(r+1),itl=devide(l);
for(;itl!=itr;++itl) itl->v+=v;
}
bool cmp(node x,node y){
return x.v<y.v;
}
int ask_rank(int l,int r,int rank){
vector<node> vec;
IT itr=devide(r+1),itl=devide(l);
for(;itl!=itr;++itl) vec.push_back(*itl);
sort(vec.begin(),vec.end(),cmp);
int i;
for(i=0;i<vec.size();++i){
rank-=(vec[i].r-vec[i].l+1);
if(rank<=0) break;
}
return vec[i].v;
}
int ask_sum(int l,int r,int x,int y){
int ans=0;
IT itr=devide(r+1),itl=devide(l);
for(;itl!=itr;++itl) ans=(ans+(itl->r-itr->l+1)*qpow(itl->v,x,y)%y)%y;
return ans;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m>>seed>>vmax;
for(int i=1;i<=n;++i) a[i]=(rnd()%vmax)+1;
int latest=a[1];
int left=1,right=1;
for(int i=2;i<=n;++i){
if(a[i]!=latest){
s.insert(node(left,right,latest));
latest=a[i];
left=i;
right=i;
}
else ++right;
}
s.insert(node(left,n,latest));
s.insert(node(n+1,n+1,0));
for(int i=1;i<=m;++i){
int op=(rnd()%4)+1;
int l=(rnd()%n)+1;
int r=(rnd()%n)+1;
if(l>r) swap(l,r);
if(op==1){
int x=(rnd()%vmax)+1;
add(l,r,x);
}
if(op==2){
int x=(rnd()%vmax)+1;
change(l,r,x);
}
if(op==3){
int x=(rnd()%(r-l+1))+1;
cout<<ask_rank(l,r,x)<<"\n";
}
if(op==4){
int x=(rnd()%vmax)+1;
int y=(rnd()%vmax)+1;
cout<<ask_sum(l,r,x,y)<<"\n";
}
}
return 0;
}